0

我声明并分配了一些字节数组。我想用 read(byte array, offset, byte length) 方法初始化这些数组。第一个 read 方法语句似乎正确地将前 32 个字节读入数组。但是,第二个读取方法不会并引发 indexOutOfBounds 异常。

偏移值规范:

offset 0, length 32 bytes - contains some text
offset 32, length 2 bytes - contains something else
etc

这是代码:

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();

我正在假设(可能不正确)读取位置会在每个新的 .read() 方法语句期间自动增加。然而,如果我将 34 个元素分配给 array2 而不是 2 个元素,则不会引发异常。因此,似乎前 34 个字节被读入 array2 而不是最后 2 个字节,即使我指定了偏移量和字节长度......

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

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

4

1 回答 1

7

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

因此

in.read(array2, 32, 2);

表示您要在偏移量 32 处从 in 读取 2 个字节InputStreamarray2但 array2 的长度仅为 2 个字节。这导致IndexOutOfBounds.

利用

in.read(array2, 0, 2);

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

于 2013-09-30T13:53:50.790 回答