【发布时间】:2009-07-30 16:50:40
【问题描述】:
当使用 java.util.zip.Deflater 的 deflate 方法时,必须提供一个 byte[] 作为参数,这个 byte[] 应该初始化为多大?我读过不能保证压缩数据会比未压缩数据更小。我应该使用一定百分比的输入吗? 目前我把它做成输入的两倍
【问题讨论】:
当使用 java.util.zip.Deflater 的 deflate 方法时,必须提供一个 byte[] 作为参数,这个 byte[] 应该初始化为多大?我读过不能保证压缩数据会比未压缩数据更小。我应该使用一定百分比的输入吗? 目前我把它做成输入的两倍
【问题讨论】:
调用deflate后,再调用finished看是否还有更多的输出。例如:
byte[] buffer = new byte[BUFFER_SIZE];
while (!deflater.finished()) {
int n = deflater.deflate(buffer);
// deal with the n bytes in out here
}
如果您只想收集内存中的所有字节,您可以使用 ByteArrayOutputStream。例如:
byte[] buffer = new byte[BUFFER_SIZE];
ByteArrayOutputStream baos = new ByteArrayOutputStream();
while (!deflater.finished()) {
int n = deflater.deflate(buffer);
baos.write(buffer, 0, n);
}
return baos.toByteArray();
【讨论】:
ByteArrayOutputStream,然后在每次迭代中追加bos.append(out,0,n)
为什么 Java 将类拼错为“deflater”?这个词是“放气剂”。天哪!抱歉,我不得不把它从我的胸膛中解脱出来。
如前所述,预期用途是继续调用deflate,直到您从压缩中获得所有输出。但是,如果您真的想在一次调用中完成,那么 deflate 可以扩展数据的数量是有限的。 zlib 中有一个函数,不幸的是 Java 没有提供名为 deflateBound() 的函数,它提供了该上限。您可以只使用该函数的保守界限,并在此处复制相关行:
complen = sourceLen +
((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5;
【讨论】: