Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带Deflater和充气器的字节数组长度 我们如何理解字节数组的定义长度?_Java_Byte_Bytearray - Fatal编程技术网

Java 带Deflater和充气器的字节数组长度 我们如何理解字节数组的定义长度?

Java 带Deflater和充气器的字节数组长度 我们如何理解字节数组的定义长度?,java,byte,bytearray,Java,Byte,Bytearray,例如,在本例中,我们在这里定义字节数组的长度为100 如果必须写入字节数组的数据长度超过100字节,该怎么办? 这里的结果变量也是如此。我不明白这些长度是如何工作的,如果您不知道数据有多大,如何根据需要选择合适的字节数组长度 try { // Encode a String into bytes String inputString = "blahblahblah"; byte[] input = inputString.getBytes("

例如,在本例中,我们在这里定义字节数组的长度为100

如果必须写入
字节数组
的数据长度超过
100字节
,该怎么办? 这里的结果变量也是如此。我不明白这些长度是如何工作的,如果您不知道数据有多大,如何根据需要选择合适的字节数组长度

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
     }

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

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


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

在这里,当您调用
compresser.deflate(output)
时,您无法知道
输出所需的大小,除非您知道此方法的工作原理。但这不是一个问题,因为
输出
缓冲区

因此,您应该多次调用
deflate
,并在另一个对象(如
OutputStream
)中插入
output
,如下所示:

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

充气也是如此。

然后如何确保缓冲区与示例中的缓冲区适当?我如何有足够大的缓冲区来存储数据?另外,如果数据将被发送,它可能只是传输所有这100个字节,导致压缩无效?Java库要么从底层io设备(如
Java.io
中的设备)读取1字节/字符,要么您可以选择调用
receive()
或类似的任何方法,并传入从通道读取的最大字节数/字符数(
java.nio
)。因此,您可以设置缓冲区并重用它。该方法还返回实际读取的字节数/字符,以便知道已经读取了所有数据。对于正确的缓存大小,请考虑1的大小。不会破坏JVM内存和2。可以在一次通话中阅读和保存大多数“小”信息。完整示例如下: