java.util.zip.GZIPOutputStream
不为其底层 Deflater
的压缩级别提供构造函数参数或 setter 。
如 here 所述,有多种方法可以解决此问题,例如:
GZIPOutputStream gzip = new GZIPOutputStream(output) {
{
this.def.setLevel(Deflater.BEST_COMPRESSION);
}
};
我用这个 GZIP 压缩了一个 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
使用更高的压缩级别成功地减少了文件?
最佳答案
是的,我使用 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
我知道这不是一个很大的改进,但仍然是一个进步。
关于java - GZIP 输出流 : Increase compression level,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19138179/