Java 內(nèi)存通道

2018-02-07 11:50 更新

Java IO教程 - Java內(nèi)存通道


對文件執(zhí)行I/O的另一種方法是將文件的一個區(qū)域映射到物理內(nèi)存,并將其作為內(nèi)存數(shù)組。

我們可以使用MappedByteBuffer來執(zhí)行內(nèi)存映射文件I/O。

要使用內(nèi)存映射文件I/O,請為文件獲取FileChannel對象,并使用FileChannel的map()方法獲取MappedByteBuffer。

直接讀取或?qū)懭胗成涞淖止?jié)緩沖區(qū),而不是使用FileChannel對象的read()或write()方法。

當(dāng)從映射的字節(jié)緩沖區(qū)讀取時,我們從已經(jīng)映射的文件的區(qū)域讀取。

當(dāng)寫入映射的字節(jié)緩沖區(qū)時,我們寫入文件的映射區(qū)域。

要將數(shù)據(jù)立即寫入映射字節(jié)緩沖區(qū)到存儲設(shè)備,我們需要使用映射字節(jié)緩沖區(qū)的force()方法。

我們可以以只讀,讀寫或私有模式映射文件的區(qū)域。

在只讀模式下,我們只能從映射的字節(jié)緩沖區(qū)讀取。

在讀寫模式下,我們可以從映射字節(jié)緩沖區(qū)讀取以及寫入。

專用模式也稱為寫時復(fù)制模式。當(dāng)多個程序映射文件的相同區(qū)域時,所有程序共享文件的相同區(qū)域。

當(dāng)程序修改映射區(qū)域時,僅為該程序創(chuàng)建該區(qū)域的單獨副本,該副本是其私有副本。對私人副本所做的任何修改對其他程序不可見。


例子

下面的代碼以只讀模式映射整個文件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é)果。



以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號