2010-06-12 68 views

回答

10

不,您將需要調整底層文件的大小並重新創建內存映射字節緩衝區。

RandomAccessFile file = new RandomAccessFile(/* some file */); 
MappedByteBuffer buffer = file.getChannel().map(MapMode.READ_WRITE, 0, file.length()); 

// Some stuff happens... 

// adjust the size 
file.setLength(newLength); 

// recreate the memory mapped buffer 
buffer = file.getChannel().map(MapMode.READ_WRITE, 0, file.length()); 

注意:設置文件長度有一些稍微奇怪的行爲。如果您通過地圖在超出文件末尾的特定位置(使用map.position()或map.putX(position,...))將文件寫入文件,則值將被附加到文件末尾該文件並沒有寫在你期望的位置(至少在linux上)。如果這是不受歡迎的行爲,則需要將數據追加到文件以真正增長文件。

+0

你能解釋一下這個奇怪的行爲嗎? 如果我寫超出文件末尾(通過映射的緩衝區,假定它映射整個文件大小),是不是應該追加到文件末尾? – geeko 2010-06-12 13:44:21

+1

從50個字節大小的文件開始。調用setLength(1000)來增加文件的大小。然後從文件(file.getChannel()。map(...,0,1000))創建一個新映射。如果在新的MappedByteBuffer上調用putByte(500,(byte)'x'),則值'x'將顯示爲文件中的第50個字節(基於0的索引)而不是500(可能不是奇數,但可能意外的行爲) – 2010-06-12 14:12:26

+0

我可以看到你的意思 謝謝michael – geeko 2010-06-12 14:33:52