2013-09-22 12 views
5

Java 6ではRandomAccessFileを使用していますが、バイトを読み取るときには異常な動作があります。Javaの読み取りバイトを使用する場合のIndexOutofBounds

offsetdataが適切に初期化され、次のコードで

:私は次のスタックトレースを取得

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) 

しかし、offsetdataの同じ値を持つが、次の(一見同一の)コードはうまく動作します!

randFile.seek(offset); 

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

なぜこれが起こっているのかについての洞察はありますか?

+1

「オフセット」はどの値ですか? – ssantos

答えて

6

ちょうど推測しますが、offsetはおそらく0より大きくなります。 data.lengthバイトが0より大きい位置から開始する場合は、を投げているかもしれないdata配列の最後を渡します。

したがって、配列全体を読み取る場合は、offset変数を0に設定する必要があります。また、0から始まらない場合は、data.length - offsetバイトを読んでください.-

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

あなたは正しいと思います。私は、オフセットパラメータをファイルポインタのオフセットとして誤解しました。しかし、ドキュメントは、現在のファイルポインタからデータが読み込まれることを示しています。 – jaynp

+0

これが最終的に問題だった場合は、upv​​oting/answering answerを考慮してください。他のユーザーにとっては便利かもしれません。 – ssantos

+0

ここで同じ正確な問題があった!ドキュメントを完全に誤解し、オフセットがファイル内にあると考えました。 – wayway

関連する問題