java.util.zip.GZIPOutputStream
没有提供一个构造函数参数或一个为其底层Deflater
设置压缩级别的setter。
有解决此问题的方法,例如在这里所述:
GZIPOutputStream gzip = new GZIPOutputStream(output) {
{
this.def.setLevel(Deflater.BEST_COMPRESSION);
}
};
我使用这个方法对一个10G的文件进行了GZIP压缩,与使用预设值DEFAULT_COMPRESSION
相比,文件的大小没有减少一位。
此答案回答了该问题,指出在某些情况下设置级别可能不会按计划工作。为确保万无一失,我还尝试创建了一个新的Deflater
:
this.def = new Deflater(Deflater.BEST_COMPRESSION, true);
但文件大小仍未减小...
他们为什么没有提供访问Deflater
级别的原因是什么?
还是上面的代码示例有问题?
Deflater级别起作用吗?
编辑:感谢评论。
文件可以进一步压缩吗?
它是一个UTF-8文本文件,使用默认压缩从10G压缩到10M。所以不知道压缩级别的细节,我认为它可以进一步压缩。
DEFAULT_COMPRESSION
和BEST_COMPRESSION
之间的时间差异?我没有创建真正可靠的数字的时间。但我执行了每个压缩级别的代码约五次,并且两者花费大约相同的时间(2分钟+/- 5秒)。
使用
gzip -v9
的文件大小? 由gzip创建的文件比Java创建的文件小约15KB。所以对于我的特定用例来说,不值得进一步研究这个主题。
然而,上述三个基本问题仍然存在。是否有人曾成功地使用GZIPOutputStream
的更高压缩级别减小文件?
gzip -v9
吗? - Peter Lawrey