對檔案執行I/O
的另一種方法是將檔案的一個區域對映到實體記憶體,並將其作為記憶體陣列。可以使用MappedByteBuffer
來執行記憶體對映檔案I/O
。
要使用記憶體對映檔案I/O
,請為檔案獲取FileChannel
物件,並使用FileChannel
的map()
方法獲取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