文档章节

GZIPOutputStream: Increase compression level

 炼狱
发布于 2016/09/21 18:31
字数 391
阅读 29
收藏 0

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

java.util.zip.GZIPOutputStream does not provide a constructor argument or a setter for the compression level of its underlying Deflater.

There are ways to work around this issue, as described here, for example:

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

I GZIPped a 10G file with this and its size didn't decrease by a single bit compared to using the presetDEFAULT_COMPRESSION.

The answer to this question says that under certain circumstances setting the level might not work as planned. Just to make sure, I also tried to create a new Deflater:

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

But sill no reduction in file size...

Is there a reason why they did not provide access to the Deflater level?

Or is something wrong with the code sample above?

Does the deflater level work at all?

Edit: Thanks for the comments.

  1. Can the file be compressed any further?

    It's a UTF-8 text file that is compressed from 10G to 10M using Default compression. So without knowing details about the compression levels, I reckoned it could be compressed further.

  2. Time difference between DEFAULT_COMPRESSION and BEST_COMPRESSION?

    I don't have time to create really reliable figures. But I executed the code with each compression level about five times and both take about the same time (2 minutes +/- 5 seconds).

  3. File size with gzip -v9? The file created by gzip is about 15KB smaller than the one created by java. So, for my specific use case it's not worth investigating this topic any further.

However, the three fundamental questions stated above still persist. Anyone ever successfully decreased a file using higher compression levels with GZIPOutputStream?

 

压缩:

    private static String compress(String input) throws IOException {
        if (StringUtil.isBlank(input)) {
            return input;
        }
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        GZIPOutputStream gzip = new GZIPOutputStream(out){
            {
                this.def.setLevel(Deflater.BEST_COMPRESSION);
            }
        };
        gzip.write(input.getBytes());
        gzip.close();
        return out.toString("ISO-8859-1");
    }

解压缩:

    public static String uncompress(String input) throws IOException {   
        if (input == null || input.length() == 0) {   
          return input;   
        }
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        ByteArrayInputStream in = new ByteArrayInputStream(input.getBytes("ISO-8859-1"));
        GZIPInputStream ungzip = new GZIPInputStream(in);
        byte[] buffer = new byte[256];
        int n;
        while ((n = ungzip.read(buffer)) >= 0) {
          out.write(buffer, 0, n);
        }
        // toString()使用平台默认编码,也可以显式的指定如toString("GBK")
        String output = out.toString();
        ungzip.close();
        in.close();
        out.close();
        return output;
    }  

本文转载自:http://stackoverflow.com/questions/19138179/gzipoutputstream-increase-compression-level

粉丝 1
博文 14
码字总数 2519
作品 0
深圳
私信 提问
java Future接口在logback的妙用

logback可以把N天的日志压缩成一个包(zip,gz),在压缩的时候logback采用后台异步线程的方式来实现,下面咱们就来看看Future接口在logback中的妙用。 先来看下Future接口的全貌吧。 logback 把...

曾经的十字镐
2017/11/02
61
0
PHP Zlib (GZIP) 压缩优化开启配置

GZIP 的实现有好多种方法。包括有 1,Nginx 的 GZIP 配置 2,Apache 的 mod_deflate.so 模块 3,各种 PHP 程序中通过 PHP自身 实现压缩。 等等... 期中使用 PHP 自身也有2种实现方法,一种是...

范堡
2010/10/26
3.5K
3
Optimize Tomcat6 on Oracle Linux

Fix the java.lang.OutOfMemoryError: PermGen space error by increase the size of Perm. sudo vi /etc/sysconfig/tomcat6 add following line to the end of the file: JAVA_OPTS='-Xms10......

perfectspr
2014/11/05
23
0
php-gzip

php打开gzip支持: 实际上最简单的办法,打开php目录下的php.ini文件,找到zlib.outputcompression = Off,改成zlib.outputcompression = On, 再把;zlib.outputcompression这里输入代码 需要...

charley158
2016/07/04
58
0
nginx日志导致IO负载较高,如何处理

使用Nginx来收集日志,访问量较大,在将收集的数据直接记录磁盘文件时,导致磁盘IO过高,机器直接挂掉。 为减少磁盘IO操作,将日志写如内存分区;但日志量太大,很容易将内存写满。 Nginx支持...

talance
2014/02/17
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

密码加密与微服务鉴权JWT详细使用教程

[TOC] 1.1、了解微服务状态 微服务集群中的每个服务,对外提供的都是Rest风格的接口,而Rest风格的一个最重要的规范就是:服务的无状态性。 什么是无状态? 1.服务端不保存任何客户端请求者信...

庭前云落
17分钟前
6
0
Xamarin.FormsShell基础教程(9)Shell相关类体系

Xamarin.FormsShell基础教程(9)Shell相关类体系 在Shell中,最为主要的类是Shell类。Shell类实现了大多数应用程序所需的基本UI功能的页面。除此以外,常用的类还有ShellContent、Tab、Fly...

大学霸
18分钟前
4
0
聊聊MVC、MVP、MVVM吧

先来介绍下本文结构: 三种框架的具体概念 在安卓开发上的写法、优缺点 1.概念 1.1 MVC MVC模式(Model–view–controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模...

二营长的意大利炮手
35分钟前
4
0
如果解释Python,什么是.pyc文件?

我已经了解Python是一种解释型语言......但是,当我查看我的Python源代码时,我看到.pyc文件,Windows将其识别为“编译的Python文件”。 这些来自哪里? #1楼 Python代码经历了两个阶段。 第...

javail
41分钟前
4
0
.NET Core初览

初览的应用场景为游戏服务器开发。所以测试在侧重点上更强于IO和密集型计算 TODO

梦想游戏人
43分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部