對(duì)文件執(zhí)行I/O的另一種方法是將文件的一個(gè)區(qū)域映射到物理內(nèi)存,并將其作為內(nèi)存數(shù)組。
我們可以使用MappedByteBuffer來(lái)執(zhí)行內(nèi)存映射文件I/O。
要使用內(nèi)存映射文件I/O,請(qǐng)為文件獲取FileChannel對(duì)象,并使用FileChannel的map()方法獲取MappedByteBuffer。
直接讀取或?qū)懭胗成涞淖止?jié)緩沖區(qū),而不是使用FileChannel對(duì)象的read()或write()方法。
當(dāng)從映射的字節(jié)緩沖區(qū)讀取時(shí),我們從已經(jīng)映射的文件的區(qū)域讀取。
當(dāng)寫(xiě)入映射的字節(jié)緩沖區(qū)時(shí),我們寫(xiě)入文件的映射區(qū)域。
要將數(shù)據(jù)立即寫(xiě)入映射字節(jié)緩沖區(qū)到存儲(chǔ)設(shè)備,我們需要使用映射字節(jié)緩沖區(qū)的force()方法。
我們可以以只讀,讀寫(xiě)或私有模式映射文件的區(qū)域。
在只讀模式下,我們只能從映射的字節(jié)緩沖區(qū)讀取。
在讀寫(xiě)模式下,我們可以從映射字節(jié)緩沖區(qū)讀取以及寫(xiě)入。
專用模式也稱為寫(xiě)時(shí)復(fù)制模式。當(dāng)多個(gè)程序映射文件的相同區(qū)域時(shí),所有程序共享文件的相同區(qū)域。
當(dāng)程序修改映射區(qū)域時(shí),僅為該程序創(chuàng)建該區(qū)域的單獨(dú)副本,該副本是其私有副本。對(duì)私人副本所做的任何修改對(duì)其他程序不可見(jiàn)。
下面的代碼以只讀模式映射整個(gè)文件test.txt。它讀取文件并在標(biāo)準(zhǔn)輸出上顯示內(nèi)容。
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(); } }
上面的代碼生成以下結(jié)果。
更多建議: