java - GZIP 输出流 : Increase compression level

标签 java compression deflate

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

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

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

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

answerthis question说在某些情况下设置级别可能无法按计划工作。为了确定,我还尝试创建一个新的 Deflater:

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

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

他们不提供对 Deflater 级别的访问是否有原因?

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

放气级别是否有效?

编辑:感谢您的评论

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

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

  2. DEFAULT_COMPRESSIONBEST_COMPRESSION 之间的时间差?

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

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

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

最佳答案

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

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

关于java - GZIP 输出流 : Increase compression level,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19138179/

相关文章:

c# - 压缩一个简短但重复的字符串

java - 保存或检索以前的 Camel 交换体

compression - 如何用Pigz解压缩

java - 有没有办法以编程方式告诉 Java 类的来源?

java - 使用java在unix中解压缩.Z文件

c# - DeflateStream 不适用于 MemoryStream?

python - 不使用 DEFLATE 的野外 ZIP 文件?

c# - Deflate Compression Stream 可以插入预压缩数据。 .NET 库是否存在?

java - 带有新关键字的字符串和java中的直接赋值

java - 为按钮创建类但出现 Null Exception 错误