处理HTTP ContentEncoding“deflate”
应该使用什么InputStream类型来处理将HTTP Content-Encoding设置为deflate的 URLConnection流?
对于gzip或zip的Content-Encoding,我使用GZIPInputStream,没问题。
对于“deflate”的Content-Encoding,我尝试过使用InflaterInputStream和DeflaterInputStream,但是我得到了
java.util.zip.ZipException:java.util.zip.InflaterInputStream.read中的未知压缩方法(InflaterInputStream.java:147)
我的理解是“deflate”编码是指Zlib压缩,根据文档,这应该由InflaterInputStream处理。
在HTTP / 1.1中, Content-encoding: deflate
实际上是指RFC1951定义的DEFLATE压缩算法,包含在RFC 1950的zlib数据格式中。
然而,一些供应商只是实现了RFC 1951定义的DEFLATE算法,完全忽略了RFC 1950(没有zlib头文件)。
其他人也遇到了同样的问题:
- http://www.mail-archive.com/www-talk@w3.org/msg01000.html
- Internet Explorer 8 + Deflate
为了解决这个问题,尝试实例化InflaterInputStream
传递一个使用nowrap
参数设置为true
创建的nowrap
:
in = new InflaterInputStream(conn.getInputStream()), new Inflater(true));
不幸的是,将InflaterInputStream与Inflater对象一起使用并不总能产生正确的解压缩。 我必须检测标题并告诉Inflater有效载荷的偏移量。
http://thushw.blogspot.com/2014/05/decoding-html-pages-with-content.html