2013-09-30 23 views
0

我聲明並分配一些字節數組。我想用read(字節數組,偏移量,字節長度)方法初始化這些數組。第一個讀取方法語句似乎正確地將前32個字節讀入數組中。但是,第二個讀取方法不會拋出indexOutOfBounds異常。如何通過使用DataInputStream類指定偏移量和字節長度來將字節讀入數組?

規範的偏移值:

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。

正確使用的任何建議,以使用指定的偏移量和字節長度獲得的數據初始化兩個數組?

回答

7

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

因此

in.read(array2, 32, 2); 

意味着要讀取來自2個字節在InputStreamarray2在偏移32,但數組2僅具有2個字節的長度。這導致IndexOutOfBounds

使用

in.read(array2, 0, 2); 

填補array2InputStream接下來的2個字節。

相關問題