Deflater和GZip压缩之间的区别

7

我目前正在使用java.util.zip.Deflater进行压缩。同时,可以使用java.util.zip.GZIPOutputStream进行压缩。这里我主要关注基本的字节数组压缩。
有人能告诉我这些Deflater和GZIPOutputStream之间的区别吗?(从性能方面考虑...)。

2个回答

10

Deflater 会生成 zlib-wrapped deflate 压缩数据,除非 nowrap 为 true,此时它会生成原始(未封装的)deflate 压缩数据。

GZIPOutputStream 会生成 gzip-wrapped deflate 数据。

deflate是在RFC 1951中定义的一种压缩数据格式。

zlib 是一个两字节的标头和四字节的尾部,提供紧凑的流识别和未压缩数据的完整性检查。zlib 在RFC 1950中描述。

gzip 是一个10+字节的标头和8字节的尾部,提供元数据和完整性检查,其中元数据可以包括文件名、修改日期、起源操作系统、注释和额外数据。gzip 在RFC 1952中描述。

在性能方面没有区别,除了头部和尾部的几个字节不同之外。


1

GZIPOutputStream 只有一个速度/压缩比的设置,不能更改。而 Deflater 有十个可能的比率,从最快+最少压缩到最慢+最多压缩。这里有一篇很好的文章,其中包含图表关于此问题


2
@MarkAdler - Java实现的GZip不允许直接更改压缩级别设置,请参阅其构造函数和方法:https://docs.oracle.com/javase/7/docs/api/java/util/zip/GZIPOutputStream.html。在内部,它可以访问“def”字段,该字段是流的内部压缩器Deflator类型。因此,可以覆盖流以访问受保护的“def”并在那里设置级别,但不能直接通过GZip接口进行设置。 - Vadim Yarovoy
文章的Wayback机器链接,包含图表:https://web.archive.org/web/20171220132048/https://java-performance.info/performance-general-compression/ - dbep

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