如何通过使用DataInputStream类指定偏移量和字节长度来将字节读入数组?

COD*_*ACK 0 java io binaryfiles

我声明并分配一些字节数组.我想用read(字节数组,偏移量,字节长度)方法初始化这些数组.第一个读取方法语句似乎正确地将前32个字节读入数组.但是,第二个读取方法不会抛出indexOutOfBounds异常.

偏移值的规范:

offset 0, length 32 bytes - contains some text
offset 32, length 2 bytes - contains something else
etc
Run Code Online (Sandbox Code Playgroud)

这是代码:

File file = new File("somebinaryfile.dat");
DataInputStream in = new DataInputStream(new FileInputStream(file));

byte[] array1 = new byte[32];   // first array 
byte[] array2 = new byte[2];    // second array

in.read(array1, 0, 32);
in.read(array2, 32, 2);

in.close();
Run Code Online (Sandbox Code Playgroud)

我正在假设(可能不正确)在每个新的.read()方法语句中读取位置将自动增加.然而,如果我将34个元素分配给array2而不是仅仅2个元素,则不会抛出任何异常.因此,看起来前34个字节被读入array2而不是最后2个字节,即使我指定了偏移和字节长度......

我意识到RandomAccessFile类有一个漂亮的.seek(n)方法.但是,我很顽固,并希望坚持使用DataInputStream.

关于正确使用的任何建议,以便使用指定的偏移量和字节长度获得的数据初始化两个数组?

Ren*_*ink 7

offset参数是of read(byte[] arr, int offset, int length)的偏移量arr.不是流的偏移量.

从而

in.read(array2, 32, 2);
Run Code Online (Sandbox Code Playgroud)

意味着你想要从in中读取2个字节InputStreamarray2偏移量32,但是array2只有2个字节的长度.这导致了IndexOutOfBounds.

使用

in.read(array2, 0, 2);
Run Code Online (Sandbox Code Playgroud)

从中填充array2接下来的2个字节InputStream.