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