首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GZIPOutputStream:提高压缩级别

GZIPOutputStream:提高压缩级别
EN

Stack Overflow用户
提问于 2013-10-02 13:35:05
回答 2查看 15.2K关注 0票数 17

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

正如这里所描述的,有一些方法可以解决这个问题,例如:

代码语言:javascript
复制
GZIPOutputStream gzip = new GZIPOutputStream(output) {
    {
        this.def.setLevel(Deflater.BEST_COMPRESSION);
    }
};

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

回答 to 这个问题表示,在某些情况下,设置该级别可能无法按计划工作。为了确保,我还尝试创建一个新的Deflater

代码语言:javascript
复制
this.def = new Deflater(Deflater.BEST_COMPRESSION, true);

但不能减少文件大小..。

他们没有提供对Deflater级别的访问有什么原因吗?

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

平减指数水平起作用了吗?

编辑:感谢评论

  1. 该文件还能进一步压缩吗? 它是一个UTF-8文本文件,使用默认压缩从10G压缩到10M。所以,在不知道压缩级别的细节的情况下,我估计它可以被进一步压缩。
  2. DEFAULT_COMPRESSIONBEST_COMPRESSION的时差? 我没有时间去创造真正可靠的数字。但是我在每个压缩级别上执行了大约5次代码,并且两者的执行时间大致相同(2分+-5秒)。
  3. 文件大小与gzip -v9?gzip创建的文件比java创建的文件小约15 by。因此,对于我的具体用例,不值得进一步研究这个主题。

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

EN

回答 2

Stack Overflow用户

发布于 2015-09-15 07:28:43

是的,我使用java稍微提高了我的数据压缩比。

代码语言:javascript
复制
class MyGZIPOutputStream 
    extends GZIPOutputStream {

    public MyGZIPOutputStream( OutputStream out ) throws IOException {
        super( out );
    } 

    public void setLevel( int level ) {
        def.setLevel(level);
    }
}

把它绕在你的溪流周围,并将其设置为,

代码语言:javascript
复制
new MyGZIPOutputStream( outputstream ).setLevel( Deflater.BEST_COMPRESSION );

下面是我尝试过的3.2GB数据的性能结果,

以前的数据压缩比率(使用默认压缩):1.3823362619139712

后数据压缩比(使用最好的压缩方法):1.3836412922501984

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

票数 19
EN

Stack Overflow用户

发布于 2013-10-02 14:06:50

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19138179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档