[java.util.zip.GZIPOutputStream
不为其基础Deflater
的压缩级别提供构造函数参数或setter。
例如,有一些方法可以解决此问题,例如here:
GZIPOutputStream gzip = new GZIPOutputStream(output) {
{
this.def.setLevel(Deflater.BEST_COMPRESSION);
}
};
我用它压缩了一个10G的文件,与使用预设的DEFAULT_COMPRESSION.
相比,它的大小没有减少一个位
answer至this question表示在某些情况下,设置级别可能无法按计划进行。为了确保这一点,我还尝试创建一个新的Deflater
:
this.def = new Deflater(Deflater.BEST_COMPRESSION, true);
但是不能减小文件大小...
有没有原因他们不提供对Deflater
级别的访问权限?
或者上面的代码示例有问题吗?
放气水平完全可以使用吗?
编辑:感谢您的[[评论。
这是UTF-8文本文件,使用以下格式从10G压缩到10M:默认压缩。因此,在不了解有关压缩级别,我认为可以进一步压缩。
DEFAULT_COMPRESSION
和BEST_COMPRESSION
之间的时间差? 我没有时间来创建真正可靠的数字。但是我以每个压缩级别执行了大约五次代码,并且都花费了大约相同的时间(2分钟+/- 5秒)。
gzip -v9
的文件大小?gzip创建的文件比java创建的文件小15KB。因此,对于我的特定用例,不值得进一步研究此主题。但是,上述三个基本问题仍然存在。任何人都可以通过GZIPOutputStream
使用更高的压缩级别成功删除文件吗?
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
我知道这不是很大的进步,但仍然是进步。
GZIPOutputStream
的定义,这是Deflater
的简单包装,并在创建Deflater
实例时使自己的版本更改级别。org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream
org.apache.commons.compress.compressors.gzip.GzipParameters#setCompressionLevel(int)