0

いくつかのバイト配列を宣言して割り当てます。これらの配列を read(byte array, offset, byte length) メソッドで初期化したい。最初の read メソッド ステートメントは、最初の 32 バイトを正しく配列に読み取ったようです。ただし、2 番目の読み取りメソッドはそうではなく、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() メソッドステートメントごとに読み取り位置が自動的に増加するという仮定の下で作業しています(おそらく間違っています)。ただし、2 つの要素ではなく 34 の要素を array2 に割り当てると、例外はスローされません。したがって、オフセットとバイト長を指定しているにもかかわらず、最後の 2 バイトだけでなく、最初の 34 バイトが array2 に読み込まれているように見えます...

RandomAccessFile クラスには気の利いた .seek(n) メソッドがあることに気付きました。ただし、私はかなり頑固で、DataInputStream に固執したいと考えています。

指定されたオフセットとバイト長を使用して取得したデータで 2 つの配列を初期化するための正しい使用法に関するアドバイスはありますか?

4

1 に答える 1

7

のオフセット引数read(byte[] arr, int offset, int length)は、 のオフセットですarr。ストリームのオフセットではありません。

したがって

in.read(array2, 32, 2);

InputStreaminからオフセット 32に 2 バイトを読み込みたいarray2が、array2 の長さは 2 バイトしかないことを意味します。それが原因IndexOutOfBoundsです。

使用する

in.read(array2, 0, 2);

array2からの次の 2 バイトで埋めますInputStream

于 2013-09-30T13:53:50.790 に答える