在Java中使用Inflater解压缩gzip数据

4
我正试图使用 Inflater 解压gzipped数据。根据文档,如果参数“nowrap”为真,则不会使用ZLIB标头和校验和字段。这提供了与GZIP和PKZIP使用的压缩格式的兼容性。注意:当使用“nowrap”选项时,还需要提供额外的“虚拟”字节作为输入。这是ZLIB本地库所需的,以支持某些优化。将true传递给构造函数,然后尝试解压缩数据会导致抛出DataFormatException:invalid block type。按照此答案中的说明,我已经将一个虚拟字节添加到 setInput()的参数末尾,但仍然无法解决问题。我是否需要改用GZIPInputStream ?我做错了什么?
2个回答

7
Java文档有误或至少是误导性的:

nowrap - 如果为真,则支持GZIP兼容压缩

nowrap的含义是将解压缩原始deflate数据。gzip流是一个带有gzip头和尾的原始deflate数据包装。要完全使用此类解码gzip格式,您需要按照RFC 1952中描述的处理gzip头,使用inflater解压缩原始deflate数据,使用该类计算未压缩数据的crc32,然后验证gzip尾中的crc和长度(模2^32),如RFC所指定的那样。

3
顺便说一句,他们还拼错了这个班级的名称。应该是“inflator”。嗯,算了。 - Mark Adler

2

我认为要读取GZIP流,仅设置nowrap=true是不够的,您还必须消耗gzip头,它不是压缩流的一部分。请参见例如readHeader() 在这个实现中


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接