【问题标题】:Gunzipping Contents of a URL - Java压缩 URL 的内容 - Java
【发布时间】:2011-10-08 16:15:25
【问题描述】:

正如标题所示,我正在尝试从 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 并没有帮助,而且大小比给我问题的数据流更大或更小的数据流都可以正常工作。

编辑:问题也不在于原始 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();

【问题讨论】:

    标签: java http gzip bytearray inputstream


    【解决方案1】:

    数据流中可能不可用。您的第一个 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);
    }
    

    【讨论】:

      【解决方案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
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-24
        相关资源
        最近更新 更多