GZIP输出流:提高压缩级别

2022-09-03 01:41:15

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

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

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

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

这个问题的答案说,在某些情况下,设置水平可能无法按计划工作。为了确保这一点,我还尝试创建一个新的:Deflater

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

但是窗台没有减少文件大小...

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

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

放气水平是否有效?

编辑:感谢您的评论

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

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

  2. 和 之间的时差 ?DEFAULT_COMPRESSIONBEST_COMPRESSION

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

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

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


答案 1

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

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


答案 2

您可以复制 的定义,这是 一个简单的包装,并创建自己的版本,在创建实例时更改级别。GZIPOutputStreamDeflaterDeflater


推荐