正如标题所暗示的那样,我正试图从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);
使用一些网址,它可以正常工作。我得到这样的输出:
42/42
[B@96e8209
The entire 42 bytes of my data. Abcdefghij.
与其他人一起,它给了我类似以下输出:
22/77
[B@1d94882
The entire 77 bytes of
正如您所看到的,如果不是相同的话,前几个奇数字节的数据非常相似,因此它们不应该导致这些问题。我真的无法把它钉死。增加CONTENT_LENGTH
没有帮助,并且数量大于和小于给我问题的数据流都可以正常工作。
编辑:问题也不在于原始的gzip压缩数据,因为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();
答案 0 :(得分:2)
数据在流中可能无法使用。您所说的第一个println()表示您只读取了22个字节,因此在调用read()时只有22个字节可用。您可以尝试循环,直到您读取CONTENT_LENGTH个字节值。也许是这样的:
int index = 0;
int bytesRead = gbuffer.read(gbytes);
while(bytesRead>0 && index<len) {
index += bytesRead;
bytesRead = gbuffer.read(gbytes,index,len-index);
}
答案 1 :(得分:2)
GZIPInputStream.read()
无法保证在一次通话中读取所有数据。你应该使用一个循环:
byte[] buf = new byte[1024];
int len = 0, total = 0;
while ((len = gbuffer.read(buf)) > 0) {
total += len;
// do something with data
}