处理 HTTP 内容编码“放气”

应使用哪种 InputStream 类型来处理将 HTTP 内容编码设置为放气的 URLConnection 流?

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

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

java.util.zip.ZipException: unknown compression method at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:147)

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


答案 1

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

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

其他人也受到同样问题的打击:

为了解决此问题,请尝试实例化在参数设置为 :InflaterInputStreamInflaternowraptrue

in = new InflaterInputStream(conn.getInputStream()), new Inflater(true));

答案 2

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

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


推荐