5

当使用 java.util.zip.Deflater 的 deflate 方法时,必须提供一个 byte[] 作为参数,这个 byte[] 应该初始化到多大?我读过不能保证压缩数据会比未压缩数据更小。我应该使用一定百分比的输入吗?目前我把它做成输入的两倍大

4

2 回答 2

8

调用后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();
于 2009-07-30T16:58:09.097 回答
7

为什么 Java 将类拼错为“deflater”?这个词是“放气剂”。天哪!对不起,不得不把它从我的胸口拿走。

如前所述,预期用途是继续调用deflate,直到您从压缩中获得所有输出。但是,如果您真的想在一次调用中执行此操作,那么 deflate 可以扩展数据的数量是有限的。zlib中有一个函数,不幸的是,Java 没有提供该函数,deflateBound()它提供了该上限。您可以只使用该函数的保守界限,并在此处复制相关行:

complen = sourceLen +
          ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5;
于 2013-02-04T03:27:47.180 回答