Итак, как следует из заголовка, я пытаюсь получить и заархивировать строку из 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();