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
}