繁体   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