2017-07-25 26 views
0

MappedByteBufferを使用してファイルにデータを格納/ロードすることを考えています。フィールドAがlong型で、フィールドBがシリアル化されているとき、以下のようになっているとしましょう。 A(long)| B(文字列)MappedByteBufferを使用する場合のIndexOutOfBoundsException

今、私はそれに書いて読んでみたい。ここでは、サンプルコードの一部です:

RandomAccessFile file = new RandomAccessFile(dataPath.toString(), "rw"); 
    MappedByteBuffer mbb = file.getChannel().map(FileChannel.MapMode 
      .READ_WRITE, 0, 256); 
    long num = 500; 
    mbb.putLong(0, num); // (1) first write the long value at beginning 
    String str = "Hello World!"; 
    byte[] input = str.getBytes(); 
    //then write a string 
    mbb.put(input, 8, input.length); // (2) IndexOutOfBoundsException 

だから後で、私は

mbb.getLong(0)
mbb.get(outputArray,8,outputArray.length)を呼び出すことで、長い取得することができますが、今、私は場所で失敗しています(2)。助言がありますか?

+1

バイト配列がゼロから始まるときに '0'を入れなければならない –

+0

メモ:読んでいるときに' outputArray.length'を使うことはできません。いくら配分する –

+0

@IlyaBursovありがとう!あなたの最初のポイントのために...私は文字列が8番目の位置から始まる2番目のフィールドになりたいから2番目のポイントについては、MAX_LENの上限を指定することができます。そのバッファに読み込みますか? – stranger

答えて

1

は、そうでなければ、配列のな長さの上に8つのバイトを書き込もうとするだろう、私はあなたがオフセット8バイトで書き込みを開始したいとは思わない

mbb.put(destArray, 0, sourceArray.length) 

を試してみてください。

+0

は応答に感謝します。しかし、私はファイルにマップされた{long、string}の構造を保つつもりです。私は常にpos 8で文字列を取得します。 – stranger

+0

あなたは長さが10の配列を持っているとしますが、オフセット8から始まる10バイト(array.length)を書き込んでみるとどうなりますか? 外出する前には2バイトしか持っていません。 – adiaz004

+0

ありがとうございます。今私はあなたが意味するものを得る。オフセットはsrcバイト配列(コード内のoutputArrayと私の場合は入力)のためのものですか? – stranger

関連する問題