GZIPOutputStream:提高压缩级别

时间:2013-10-02 13:35:06

标签: java compression deflate

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

有很多方法可以解决此问题,如here所述,例如:

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

我使用此GZIPped 10G文件,与使用预设DEFAULT_COMPRESSION.

相比,它的大小没有减少一位

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

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

但是文件大小不会减少......

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

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

deflater级别是否有效?

修改:感谢评论

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

    这是一个UTF-8文本文件,使用时从10G压缩到10M 默认压缩。所以不知道有关的细节 压缩级别,我估计它可以进一步压缩。

  2. DEFAULT_COMPRESSIONBEST_COMPRESSION之间的时差?

    我没有时间创造真正可靠的数字。但是我执行了每个压缩级别大约五次的代码,两次大约需要相同的时间(2分钟+/- 5秒)。

  3. gzip -v9的文件大小? gzip创建的文件比java创建的文件小15KB。因此,对于我的具体用例,不值得再深入研究这个主题。

  4. 然而,上述三个基本问题仍然存在。有人使用GZIPOutputStream更高的压缩级别成功减少了文件吗?

2 个答案:

答案 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实例时使您自己的版本更改级别。