Gunzipping Содержимое URL - Java

Так что, как следует из названия, я пытаюсь получить и заархивировать строку из HTTP-запроса.

urlConn = url.openConnection();
int len = CONTENT_LENGTH
byte[] gbytes = new byte[len];
gbuffer = new GZIPInputStream(urlConn.getInputStream(), len);
System.out.println(gbuffer.read(gbytes)+"/"+len);
System.out.println(gbytes);
result = new String(gbytes, "UTF-8");
gbuffer.close();
System.out.println(result);

С некоторыми URL-адресами все работает нормально. Я получаю вывод, как это:

42/42
[B@96e8209
The entire 42 bytes of my data. Abcdefghij.

С другими это дает мне что-то вроде следующего вывода:

22/77
[B@1d94882
The entire 77 bytes of

Как видите, первые несколько нечетных байтов данных очень похожи, если не совпадают, поэтому они не должны вызывать эти проблемы. Я действительно не могу связать это. Увеличение CONTENT_LENGTH не помогает, и потоки данных больших и меньших размеров, чем те, которые вызывают у меня проблемы, работают нормально.

РЕДАКТИРОВАТЬ: Проблема также не лежит в сырых сжатых данных, так как Какао и Питон оба разархивируют без проблем.

РЕДАКТИРОВАТЬ: Решено. Включая окончательный код:

urlConn = url.openConnection();
int offset = 0, len = CONTENT_LENGTH
byte[] gbytes = new byte[len];
gbuffer = new GZIPInputStream(urlConn.getInputStream(), len);
while(offset < len)
{
    offset += gbuffer.read(gbytes, offset, offset-len);
}
result = new String(gbytes, "UTF-8");
gbuffer.close();

2 ответа

Решение

Возможно, данные не доступны в потоке. Первая функция println() говорит, что вы прочитали только 22 байта, поэтому только 22 байта были доступны при вызове read(). Вы можете попробовать зацикливание, пока не прочитаете байты CONTENT_LENGTH. Может быть что-то вроде:

int index = 0;
int bytesRead = gbuffer.read(gbytes);
while(bytesRead>0 && index<len) {
    index += bytesRead;
    bytesRead = gbuffer.read(gbytes,index,len-index);
}

GZIPInputStream.read() не гарантируется чтение всех данных за один вызов. Вы должны использовать цикл:

byte[] buf = new byte[1024];
int len = 0, total = 0;
while ((len = gbuffer.read(buf)) > 0) {
    total += len;
    // do something with data
}
Другие вопросы по тегам