【问题标题】:GZIPOutputStream: Increase compression levelGZIPOutputStream:增加压缩级别
【发布时间】:2013-10-08 21:52:01
【问题描述】:

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

有一些方法可以解决这个问题,如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 级别的访问权限是否有原因?

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

deflater 级别是否有效?

编辑:感谢cmets

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

    这是一个 UTF-8 文本文件,使用 10G 压缩到 10M 默认压缩。所以在不知道细节的情况下 压缩级别,我认为它可以进一步压缩。

  2. DEFAULT_COMPRESSIONBEST_COMPRESSION 之间的时间差?

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

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

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

【问题讨论】:

  • 您确定文件可以进一步压缩吗?它不是已经采用(有效)压缩格式(比如 MP4)的东西吗?
  • 你能将大小与在命令上压缩它进行比较,例如gzip -v9
  • 无论是否更小,它都应该消耗更多的CPU。你可以计时。

标签: java compression deflate


【解决方案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】:

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

    【讨论】:

      猜你喜欢
      • 2015-12-29
      • 1970-01-01
      • 2018-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-22
      • 2023-04-05
      • 1970-01-01
      相关资源
      最近更新 更多