11
有沒有辦法擴展Java內存映射字節緩衝區,使新的大小反映回磁盤上的映射文件?擴展Java內存映射字節緩衝區
有沒有辦法擴展Java內存映射字節緩衝區,使新的大小反映回磁盤上的映射文件?擴展Java內存映射字節緩衝區
不,您將需要調整底層文件的大小並重新創建內存映射字節緩衝區。
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上)。如果這是不受歡迎的行爲,則需要將數據追加到文件以真正增長文件。
你能解釋一下這個奇怪的行爲嗎? 如果我寫超出文件末尾(通過映射的緩衝區,假定它映射整個文件大小),是不是應該追加到文件末尾? – geeko 2010-06-12 13:44:21
從50個字節大小的文件開始。調用setLength(1000)來增加文件的大小。然後從文件(file.getChannel()。map(...,0,1000))創建一個新映射。如果在新的MappedByteBuffer上調用putByte(500,(byte)'x'),則值'x'將顯示爲文件中的第50個字節(基於0的索引)而不是500(可能不是奇數,但可能意外的行爲) – 2010-06-12 14:12:26
我可以看到你的意思 謝謝michael – geeko 2010-06-12 14:33:52