Java內存通道

對文件執行I/O的另一種方法是將文件的一個區域映射到物理內存,並將其作爲內存數組。可以使用MappedByteBuffer來執行內存映射文件I/O

要使用內存映射文件I/O,請爲文件獲取FileChannel對象,並使用FileChannelmap()方法獲取MappedByteBuffer
直接讀取或寫入映射的字節緩衝區,而不是使用FileChannel對象的read()write()方法。
當從映射的字節緩衝區讀取時,從已經映射的文件區域讀取。當寫入映射的字節緩衝區時,寫入文件映射區域。

要將數據立即寫入映射字節緩衝區到存儲設備,需要使用映射字節緩衝區的force()方法。可以以只讀,讀寫或私有模式映射文件的區域。

在只讀模式下,只能從映射的字節緩衝區讀取。在讀寫模式下,可以從映射字節緩衝區讀取以及寫入。
專用模式也稱爲寫時複製模式。當多個程序映射文件的相同區域時,所有程序共享文件的相同區域。

當程序修改映射區域時,僅爲該程序創建該區域的單獨副本,該副本是其私有副本。對私人副本所做的任何修改對其他程序不可見。

示例

下面的代碼以只讀模式映射整個文件test.txt。 它讀取文件並在標準輸出上顯示內容。

import java.io.FileInputStream;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;

public class Main {
    public static void main(String[] args) throws Exception {
        FileInputStream fis = new FileInputStream("test.txt");
        FileChannel fc = fis.getChannel();

        long startRegion = 0;
        long endRegion = fc.size();
        MappedByteBuffer mbb = fc.map(FileChannel.MapMode.READ_ONLY, startRegion, endRegion);
        while (mbb.hasRemaining()) {
            System.out.print((char) mbb.get());
        }
        fis.close();
    }
}

上面的代碼生成以下結果。

test
test
test
test