2013-09-22 2 views
5

Я использую RandomAccessFile в Java 6, но при чтении байтов имеет странное поведение.IndexOutofBounds при использовании прочитанных байтов Java

С помощью следующего кода, где offset и data надлежащим образом инициализируется:

int offset; 
byte data[]; 
randFile.readFully(data, offset, data.length); 

я получаю трассировку стека:

null 
java.lang.IndexOutOfBoundsException 
    at java.io.RandomAccessFile.readBytes(Native Method) 
    at java.io.RandomAccessFile.read(RandomAccessFile.java:355) 
    at java.io.RandomAccessFile.readFully(RandomAccessFile.java:414) 

, но с теми же значениями offset и data, то следующий (казалось бы, идентичный) код работает отлично!

randFile.seek(offset); 

for (int i = 0; i < (data.length); i += 1) { 
    data[i] = randFile.readByte(); 
} 

Кто-нибудь знает, почему это может быть?

+1

Какое значение имеет 'offset'? – ssantos

ответ

6

Просто гадать, но у вас, вероятно, есть offset больше 0; если вы читаете data.length байт, начиная с позиции больше 0, вы передадите конец массива data, который может вызывать IndexOutOfBoundsException.

Итак, если вы хотите прочитать полный массив, переменная offset должна быть установлена ​​в 0. Кроме того, если вы не хотите, чтобы начать с 0, вы должны прочитать data.length - offset bytes.-

randFile.readFully(data, offset, data.length - offset); 
+0

Я думаю, вы правы. Я неправильно понял параметр offset как смещение указателя файла. Но в документации указано, что данные считываются из текущего указателя файла. – jaynp

+0

Если это, в конечном счете, проблема, пожалуйста, рассмотрите вопрос о возврате/принятии ответа, это может быть полезно для других пользователей. – ssantos

+0

Здесь была такая же проблема! Полностью неверно истолковал документацию и подумал, что смещение было в файле. – wayway

Смежные вопросы