一个URL的Gunzipping内容 - 的Java(Gunzipping Contents of

2019-10-28 19:19发布

因此,作为标题所暗示的,我想获得和用gunzip从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压缩的内说谎,可可和Python都用gunzip它没有问题。

编辑 :解决。 包括最后的代码:

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();

Answer 1:

这有可能是该数据不是流中获得。 第一的println()你说你只读过22个字节,所以只有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);
}


Answer 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
}


文章来源: Gunzipping Contents of a URL - Java