Gunzipping URL的内容 - Java

时间:2011-07-19 15:57:50

标签: java http gzip bytearray inputstream

正如标题所暗示的那样,我正试图从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();

2 个答案:

答案 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
}