[GZIPOutputStream:增加压缩级别

问题描述 投票:14回答:3

[java.util.zip.GZIPOutputStream不为其基础Deflater的压缩级别提供构造函数参数或setter。

例如,有一些方法可以解决此问题,例如here

GZIPOutputStream gzip = new GZIPOutputStream(output) {
    {
        this.def.setLevel(Deflater.BEST_COMPRESSION);
    }
};

我用它压缩了一个10G的文件,与使用预设的DEFAULT_COMPRESSION.相比,它的大小没有减少一个位

answerthis question表示在某些情况下,设置级别可能无法按计划进行。为了确保这一点,我还尝试创建一个新的Deflater

this.def = new Deflater(Deflater.BEST_COMPRESSION, true);

但是不能减小文件大小...

有没有原因他们不提供对Deflater级别的访问权限?

或者上面的代码示例有问题吗?

放气水平完全可以使用吗?

编辑:感谢您的[[评论。

  1. 可以进一步压缩文件吗?

    这是UTF-8文本文件,使用以下格式从10G压缩到10M:默认压缩。因此,在不了解有关压缩级别,我认为可以进一步压缩。

  2. DEFAULT_COMPRESSIONBEST_COMPRESSION之间的时间差?

    我没有时间来创建真正可靠的数字。但是我以每个压缩级别执行了大约五次代码,并且都花费了大约相同的时间(2分钟+/- 5秒)。

  3. gzip -v9的文件大小?gzip创建的文件比java创建的文件小15KB。因此,对于我的特定用例,不值得进一步研究此主题。

但是,上述三个基本问题仍然存在。任何人都可以通过GZIPOutputStream使用更高的压缩级别成功删除文件吗?

java compression deflate
3个回答
13
投票
是,我使用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

我知道这不是很大的进步,但仍然是进步。


3
投票
您可以复制GZIPOutputStream的定义,这是Deflater的简单包装,并在创建Deflater实例时使自己的版本更改级别。

0
投票
org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream org.apache.commons.compress.compressors.gzip.GzipParameters#setCompressionLevel(int)
© www.soinside.com 2019 - 2024. All rights reserved.