簡體   English   中英

內存映射文件java NIO

[英]Memory mapped file java NIO

我理解如何創建一個內存映射文件,但我的問題是讓我們說在以下行:

FileChannel roChannel = new RandomAccessFile(file, "r").getChannel();
ByteBuffer roBuf = roChannel.map(FileChannel.MapMode.READ_ONLY, 0, SIZE);

例如,我將SIZE設置為2MB,這是否意味着它只會加載2MB的文件,還是會在文件中進一步讀取並更新緩沖區,因為我從中消耗了字節數?

例如,我將SIZE設置為2MB,這是否意味着它只會加載2MB的文件,還是會在文件中進一步讀取並更新緩沖區,因為我從中消耗了字節數?

它只會加載緩沖區初始化中指定的文件部分。 如果你想進一步閱讀,你需要有一些讀取循環。 雖然我不會說這很棘手,如果一個人不熟悉所涉及的java.io和java.nio API,那么填充它的可能性很高。 (例如:不翻轉緩沖區;緩沖區/文件邊緣錯誤)。

如果您正在尋找一種在ByteBuffer中訪問此文件的簡單方法,請考慮使用MappedByteBuffer

RandomAccessFile raf = new RandomAccessFile(file, "r");
FileChannel fc = raf.getChannel();
MappedByteBuffer buffer = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());

在這種情況下使用MBB的好處是,它不一定實際將整個緩沖區加載到內存中,而只是加載您正在訪問的部分。

緩沖區的大小是您傳入的大小。它不會增長或縮小。

javadoc說:

將此頻道文件的某個區域直接映射到內存中。

...

size - 要映射的區域的大小; 必須是非負數且不大於Integer.MAX_VALUE

編輯:

根據“更新新數據”的含義,答案是肯定的。

由此類的實例提供的文件視圖保證與同一程序中其他實例提供的同一文件的其他視圖一致 然而,由於底層操作系統執行的高速緩存和網絡文件系統協議引起的延遲,該類實例提供的視圖可能會也可能不會與其他同時運行的程序所看到的視圖一致。 無論這些其他程序的編寫語言是什么,以及它們是在同一台機器上運行還是在其他機器上運行,都是如此。 任何此類不一致的確切性質都取決於系統,因此未指定。

因此,其他系統可能會進行緩存,但是當這些緩存被刷新或以其他方式更新時,它們將同意FileChannel提供的視圖。

您還可以使用顯式調用position方法和其他方法來更改視圖顯示的內容。

無論是顯式地還是通過讀取或寫入字節來改變通道的位置,都將改變原始對象的文件位置,反之亦然。 通過文件通道更改文件長度將改變通過原始對象看到的長度,反之亦然。 通過寫入字節來更改文件的內容將更改原始對象看到的內容,反之亦然。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM