14

应该使用什么InputStream类型来处理 HTTP Content-Encoding设置为deflate的 URLConnection 流?

对于 gzip 或 zip 的内容编码,我使用 GZIPInputStream,没问题。

对于“deflate”的内容编码,我尝试使用InflaterInputStreamDeflaterInputStream但我得到了

java.util.zip.ZipException:java.util.zip.InflaterInputStream.read(InflaterInputStream.java:147)处的未知压缩方法

我的理解是“deflate”编码是指Zlib压缩,根据文档,这应该由 InflaterInputStream 处理。

4

2 回答 2

23

在 HTTP/1.1 中,Content-encoding: deflate实际上是指 DEFLATE 压缩算法,由RFC 1951定义,包装在 zlib 数据格式中,由RFC 1950定义。

然而,一些供应商只是按照定义的 RFC 1951 实现 DEFLATE 算法,完全忽略 RFC 1950(无 zlib 标头)。

其他人也遇到了同样的问题:

为了解决这个问题,尝试实例化使用参数设置为创建的InflaterInputStream传递一个:Inflaternowraptrue

in = new InflaterInputStream(conn.getInputStream()), new Inflater(true));
于 2010-10-14T10:37:55.333 回答
3

不幸的是,将 InflaterInputStream 与 Inflater 对象一起使用并不总能产生正确的解压缩。我必须检测标头并告诉 Inflater 有效载荷的偏移量在哪里。

http://thushw.blogspot.com/2014/05/decoding-html-pages-with-content.html

于 2014-05-25T18:43:05.370 回答