Java - 压缩输出的大小 - byteArray

Clo*_*lox 5 java size deflate

当使用java.util.zip.Deflater的deflate-method时,必须提供byte []作为参数,该byte []被初始化为多大?我已经读过,不能保证压缩数据甚至会比未压缩数据小.是否应该使用一定比例的输入?目前我的输入是它的两倍

Lau*_*ves 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
}
Run Code Online (Sandbox Code Playgroud)

如果您只想收集内存中的所有字节,可以使用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();
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的回答.虽然我不太明白......我是否必须多次调用deflate()直到整个输入被压缩?我应该将BUFFER_SIZE设置为什么?是否有一个教程或类似的东西解释这个?谢谢 (7认同)
  • 如果你想得到一个巨大的字节数组,在循环外创建一个`ByteArrayOutputStream`,然后在每次迭代时用`bos.append(out,0,n)追加它. (2认同)
  • 我不知道关于此的教程,但您可能会发现 GZIPOutputStream 的源代码很有启发性。它在内部使用 Deflater。它碰巧使用默认缓冲区大小 512,但您实际上可以在创建 GZIPOutputStream 时选择缓冲区大小。如果您有 JDK 源代码,您可以在那里查看 GZIPOutputStream。如果没有,您可以在此页面上看到它们:http://kickjava.com/src/java/util/zip/GZIPOutputStream.java.htm (2认同)

Mar*_*ler 7

为什么Java将这个课程拼错为"deflater"?这个词是"平减指数".哎呀!对不起,不得不放弃我的胸膛.

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

complen = sourceLen +
          ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5;
Run Code Online (Sandbox Code Playgroud)