Gunzipping Содержимое URL - Java - PullRequest
0 голосов
/ 19 июля 2011

Итак, как следует из заголовка, я пытаюсь получить и заархивировать строку из 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 не помогает, и потоки данных больших и меньших размеров, чем те, которые вызывают у меня проблемы, работают нормально.

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

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

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 ]

2 голосов
/ 19 июля 2011

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

byte[] buf = new byte[1024];
int len = 0, total = 0;
while ((len = gbuffer.read(buf)) > 0) {
    total += len;
    // do something with data
}
2 голосов
/ 19 июля 2011

Возможно, данные не доступны в потоке.Первая функция 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);
}
...