使用Deflater和Inflater的字节数组长度

3

如何理解byte array的定义长度?

例如,在这个例子中,我们定义了byte array的长度为100。

如果要写入到byte array中的数据长度超过了100字节怎么办?

对于结果变量也是一样的。我不明白这些长度是如何工作的,如果您不知道数据有多大,如何选择适当长度的byte array

try {
         // Encode a String into bytes
         String inputString = "blahblahblah";
         byte[] input = inputString.getBytes("UTF-8");

         // Compress the bytes
         **byte[] output = new byte[100];**
         Deflater compresser = new Deflater();
         compresser.setInput(input);
         compresser.finish();
         int compressedDataLength = compresser.deflate(output);
         compresser.end();

         // Decompress the bytes
         Inflater decompresser = new Inflater();
         decompresser.setInput(output, 0, compressedDataLength);
         **byte[] result = new byte[100];**
         int resultLength = decompresser.inflate(result);
         decompresser.end();

         // Decode the bytes into a String
         String outputString = new String(result, 0, resultLength, "UTF-8");
     } catch(java.io.UnsupportedEncodingException ex) {
         // handle
     } catch (java.util.zip.DataFormatException ex) {
         // handle
     }

对于这个例子,这里使用的字节数组作为输入实际上被称为缓冲区,我们如何理解它?

2个回答

3

在这里,当你调用compresser.deflate(output)时,除非你知道这个方法的工作原理,否则你无法知道需要多大的output。但这不是问题,因为output作为缓冲区而设计的。

所以你应该多次调用deflate并将output插入到另一个对象中,比如一个OutputStream,像这样:

byte[] buffer = new byte[1024];   
while (!deflater.finished()) {  
  int count = deflater.deflate(buffer);
  outputStream.write(buffer, 0, count);   
}  

同样适用于膨胀。

完整示例请参见:https://dzone.com/articles/how-compress-and-uncompress - Swati Navalkar

0

通过为字节数组分配100个字节,JVM保证调用者可以使用足够大的缓冲区来容纳100个JVM定义的字节(即8位)。任何试图访问超过100个字节的数组都会导致异常,例如:如果您直接尝试通过array[101]访问数组,则会出现ArrayIndexOutOfBoundException

如果代码像您的演示一样编写,则调用者假定数据长度永远不会超过100。


我怎么确保缓冲区与示例中合适?我该如何获取足够大的缓冲区来存储数据?另外,如果发送数据,它可能会传输所有那些 100 字节,导致压缩变得毫无意义,这该怎么办? - Arturas M
Java库可以从底层io设备中只读取1个字节/字符(如java.io中的库),或者您可以选择调用receive()或任何类似的方法,并传入要从通道(java.nio)中读取的最大字节数/字符数。因此,您可以设置一个缓冲区并重复使用它。该方法还返回实际读取的字节数/字符数,因此您知道已经读取了所有数据。 - Alex Suo
对于适当的缓存大小,请考虑以下两点:
  1. 不会超出JVM内存限制。
  2. 可以在一次调用中读取和保存大多数“小”消息。
- Alex Suo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接