GZIPOutputStream和DeflaterOutputStream有什么区别?

19

GZIPOutputStreamDeflaterOutputStream的一个子类,但两者都可以实例化。我应该在什么情况下使用一个而不是另一个?压缩效果是否相同?


1
除了答案外,GZIP 还很有趣,因为输出将与许多工具兼容,无需跳过诸如 zcat、zgrep 和能够打开 gz 存档的工具等步骤。 - Hay
3个回答

19

DeflaterOutputStreamZIPOutputStreamGZIPOutputStream之间的差异反映了它们历史压缩前辈之间的差异:

Deflate可以被认为是压缩算法的参考实现,而ZIP和GZIP是对其的“扩展”。后两者都支持“存档”概念,在Java API中ZipOutputStream中更为明显。

如果您只是尝试压缩数据流,我建议使用DeflaterOutputStream,但如果您正在创建存档,则应该考虑使用ZipOutputStream。


5
DeflaterOutputStream实现了原始的deflate压缩方法。GZIPOutputStream增加了GZIP所需的额外逻辑:CRC-32检查、GZIP魔数、GZIP头、尾等。请参见GZIPOutputStream.javaDeflaterOutputStream.java的源代码。

1
在原始响应中,链接无法使用:使用Java API压缩和解压数据 - kant
1
@Stephan 网络档案馆 ;) 使用Java API压缩和解压数据 - Puddle
@Puddle 我没有注意到g051051已经更新了链接。我撤回之前的评论。 - Stephan

2

区别在于所使用的具体压缩格式不同。根据DeflaterOutputStream的javadoc

public class DeflaterOutputStream
extends FilterOutputStream

This class implements an output stream filter for compressing data in the "deflate" compression format. It is also used as the basis for other types of compression filters, such as GZIPOutputStream.

GZIPOutputStream文档中提到:

public class GZIPOutputStream
extends DeflaterOutputStream

This class implements a stream filter for writing compressed data in the GZIP file format. 

GZIP流扩展了Deflate实现,具有针对GZIP文件格式的附加详细信息。


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