【发布时间】: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. 相比,它的大小没有减少一个比特
answer 到 this question 表示在某些情况下设置级别可能无法按计划进行。为了确保,我还尝试创建一个新的Deflater:
this.def = new Deflater(Deflater.BEST_COMPRESSION, true);
但文件大小仍然没有减少...
他们不提供Deflater 级别的访问权限是否有原因?
或者上面的代码示例有什么问题?
deflater 级别是否有效?
编辑:感谢cmets。
-
可以进一步压缩文件吗?
这是一个 UTF-8 文本文件,使用 10G 压缩到 10M 默认压缩。所以在不知道细节的情况下 压缩级别,我认为它可以进一步压缩。
-
DEFAULT_COMPRESSION和BEST_COMPRESSION之间的时间差?我没有时间创建真正可靠的数字。但是我在每个压缩级别执行了大约五次代码,并且都花费了大约相同的时间(2 分钟 +/- 5 秒)。
gzip -v9的文件大小? gzip 创建的文件比 java 创建的文件小约 15KB。因此,对于我的特定用例,不值得进一步研究此主题。
但是,上述三个基本问题仍然存在。有人用GZIPOutputStream 成功地使用更高的压缩级别减少文件吗?
【问题讨论】:
-
您确定文件可以进一步压缩吗?它不是已经采用(有效)压缩格式(比如 MP4)的东西吗?
-
你能将大小与在命令上压缩它进行比较,例如
gzip -v9 -
无论是否更小,它都应该消耗更多的CPU。你可以计时。
标签: java compression deflate