java.util.zip.GZIPOutputStream
没有为其基础Deflater
的压缩级别提供构造函数参数或setter。
有很多方法可以解决此问题,如here所述,例如:
GZIPOutputStream gzip = new GZIPOutputStream(output) {
{
this.def.setLevel(Deflater.BEST_COMPRESSION);
}
};
我使用此GZIPped 10G文件,与使用预设DEFAULT_COMPRESSION.
answer到this question表示在某些情况下设置级别可能无法按计划运行。为了确保,我还尝试创建一个新的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
更高的压缩级别成功减少了文件吗?
答案 0 :(得分:12)
是的,我使用java GZIP util稍微提高了我的数据压缩率。
class MyGZIPOutputStream
extends GZIPOutputStream {
public MyGZIPOutputStream( OutputStream out ) throws IOException {
super( out );
}
public void setLevel( int level ) {
def.setLevel(level);
}
}
只需将其包裹在您的信息流中并将级别设置为
new MyGZIPOutputStream( outputstream ).setLevel( Deflater.BEST_COMPRESSION );
以下是我尝试过3.2 GB数据的性能结果
之前的数据压缩率(使用默认压缩):1.3823362619139712
数据压缩率(使用最佳压缩后):1.3836412922501984
我知道这不是一个很大的改进,但仍然是一个进步。
答案 1 :(得分:3)
您可以复制GZIPOutputStream
的定义,这是Deflater
的简单包装,并在创建Deflater
实例时使您自己的版本更改级别。