17

java.util.zip.GZIPOutputStream不为其底层的压缩级别提供构造函数参数或设置器Deflater

有一些方法可以解决此问题,如此处所述例如:

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

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

这个问题答案是,在某些情况下,设置级别可能无法按计划进行。为了确保,我还尝试创建一个新的:Deflater

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

但是文件大小仍然没有减少......

他们是否有理由不提供对Deflater级别的访问权限?

还是上面的代码示例有问题?

deflater 级别是否有效?

编辑:感谢您的评论

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

    这是一个使用默认压缩从 10G 压缩到 10M 的 UTF-8 文本文件。因此,在不了解压缩级别的详细信息的情况下,我认为它可以进一步压缩。

  2. DEFAULT_COMPRESSION和之间的时差BEST_COMPRESSION

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

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

然而,上述三个基本问题仍然存在。任何人都曾使用更高的压缩级别成功地减少文件GZIPOutputStream

4

2 回答 2

18

是的,我使用 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

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

于 2015-09-15T07:28:43.947 回答
3

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

于 2013-10-02T14:06:50.567 回答