带有Deflater和Inflater的字节数组长度

时间:2016-01-04 10:12:16

标签: java byte bytearray

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

例如,在这个例子中,我们在这里定义字节数组的长度是100。

如果必须写入byte array的数据长于100 bytes怎么办?

这里的结果变量相同。我不明白这些长度是如何工作的,以及如果你不知道你的数据有多大,如何根据需要选择合适长度的字节数组?

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 个答案:

答案 0 :(得分:0)

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

如果代码是作为您的演示编写的,则调用者假定数据长度不超过100.

答案 1 :(得分:0)

此处,当您致电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);   
}  

同样适用于膨胀。