2017-07-25 101 views
0

我想使用MappedByteBuffer存儲/加載一些數據到文件。假設我有長度爲A的字段A,字符串的字段B在序列化時如下所示: A(long)| B(字符串)IndexOutOfBoundsException當使用MappedByteBuffer

現在我想寫和讀它。這裏是一段示例代碼:

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

而不是'8'你必須把0放在你的字節數組從零開始 –

+0

也注意:你不能像使用outputArray.length一樣讀你不知道多少分配 –

+0

@IlyaBursov謝謝!對於你的第一點......這是因爲我希望字符串成爲從第8點開始的第2個字段,對於第2點,我可以指定MAX_LEN的上限,我知道我的字符串不會長於讀入該緩衝區? – stranger

回答

1

嘗試

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

我不認爲你想開始在8字節偏移寫,否則你會試圖在陣列的lenght寫8個字節。

+0

感謝您的響應。但我打算保持{long,string}映射到文件的結構。即我總是在pos 8處取回字符串。我錯過了什麼嗎? – stranger

+0

說你有一個長度爲10的數組,當你嘗試從偏移量8開始寫10個字節(array.length)時會發生什麼? 你只有2個字節,然後出界。 – adiaz004

+0

謝謝先生。現在我明白你的意思了。你的意思是說偏移是爲src字節數組(outputArray在你的代碼和我的情況下輸入)? – stranger