java.util.zip.GZIPOutputStream没有为其基础Deflater的压缩级别提供构造函数参数或设置器。
正如这里所描述的,有一些方法可以解决这个问题,例如:
GZIPOutputStream gzip = new GZIPOutputStream(output) {
{
this.def.setLevel(Deflater.BEST_COMPRESSION);
}
};我GZIPped一个10G文件,与使用预置的DEFAULT_COMPRESSION.相比,它的大小没有减少一位
回答 to 这个问题表示,在某些情况下,设置该级别可能无法按计划工作。为了确保,我还尝试创建一个新的Deflater
this.def = new Deflater(Deflater.BEST_COMPRESSION, true);但不能减少文件大小..。
他们没有提供对Deflater级别的访问有什么原因吗?
或者上面的代码示例有问题吗?
平减指数水平起作用了吗?
编辑:感谢评论。
DEFAULT_COMPRESSION与BEST_COMPRESSION的时差?
我没有时间去创造真正可靠的数字。但是我在每个压缩级别上执行了大约5次代码,并且两者的执行时间大致相同(2分+-5秒)。gzip -v9?gzip创建的文件比java创建的文件小约15 by。因此,对于我的具体用例,不值得进一步研究这个主题。然而,上述三个基本问题仍然存在。任何人使用GZIPOutputStream使用更高的压缩级别成功地减少了文件。
发布于 2015-09-15 07:28:43
是的,我使用java稍微提高了我的数据压缩比。
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.2GB数据的性能结果,
以前的数据压缩比率(使用默认压缩):1.3823362619139712
后数据压缩比(使用最好的压缩方法):1.3836412922501984
我知道这不是一个很大的进步,但仍然是一个进步。
发布于 2013-10-02 14:06:50
您可以复制GZIPOutputStream的定义(这是Deflater的简单包装),并使您自己的版本在创建Deflater实例时更改级别。
https://stackoverflow.com/questions/19138179
复制相似问题