【问题标题】:How to read bytes into arrays by specifying offset and byte length using the DataInputStream class?如何通过使用 DataInputStream 类指定偏移量和字节长度将字节读入数组?
【发布时间】:2013-09-30 13:46:08
【问题描述】:

我声明并分配了一些字节数组。我想用 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。

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

【问题讨论】:

    标签: java io binaryfiles


    【解决方案1】:

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

    因此

    in.read(array2, 32, 2);
    

    表示你想在偏移量32处从InputStream中读取2个字节到array2,但是array2只有2个字节的长度。这会导致IndexOutOfBounds

    使用

    in.read(array2, 0, 2);
    

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

    【讨论】:

      猜你喜欢
      • 2012-01-06
      • 2015-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多