Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
内存映射文件javanio_Java_Nio_Memory Mapped Files - Fatal编程技术网

内存映射文件javanio

内存映射文件javanio,java,nio,memory-mapped-files,Java,Nio,Memory Mapped Files,我了解如何创建内存映射文件,但我的问题是,假设在下面这行: FileChannel roChannel = new RandomAccessFile(file, "r").getChannel(); ByteBuffer roBuf = roChannel.map(FileChannel.MapMode.READ_ONLY, 0, SIZE); 例如,当我将大小设置为2MB时,这是否意味着它将只加载2MB的文件,或者它将在文件中进一步读取并在我从中消耗字节时更新缓冲区?缓冲区的大小是您传入的大

我了解如何创建内存映射文件,但我的问题是,假设在下面这行:

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

例如,当我将大小设置为2MB时,这是否意味着它将只加载2MB的文件,或者它将在文件中进一步读取并在我从中消耗字节时更新缓冲区?

缓冲区的大小是您传入的大小。它不会生长或收缩

报告说:

将此频道文件的一个区域直接映射到内存中

大小-要映射的区域的大小;必须为非负且不大于Integer.MAX_值

编辑:

根据你所说的“用新数据更新”,答案是肯定的

此类实例提供的文件视图保证与同一程序中其他实例提供的同一文件的其他视图一致。但是,由于底层操作系统执行的缓存和网络文件系统协议引起的延迟,此类实例提供的视图可能与其他并发运行程序看到的视图一致,也可能不一致。这是真实的,不管这些其他程序是用什么语言编写的,也不管它们是在同一台机器上运行还是在其他机器上运行。任何此类不一致的确切性质取决于系统,因此未明确说明

因此,其他系统可能会进行缓存,但当这些缓存刷新或以其他方式更新时,它们将与
文件通道
显示的视图一致

您还可以使用对
position
方法和其他方法的显式调用来更改视图显示的内容

无论是显式更改通道位置,还是通过读取或写入字节更改通道位置,都将更改原始对象的文件位置,反之亦然。通过文件通道更改文件长度将更改通过原始对象看到的长度,反之亦然。通过写入字节更改文件内容将更改原始对象看到的内容,反之亦然

例如,当我将大小设置为2MB时,这是否意味着它将只加载2MB的文件,或者它将进一步读取文件并在我从中消耗字节时更新缓冲区

它将只加载缓冲区初始化中指定的文件部分。如果你想让它读得更远,你需要有某种读循环。虽然我不会说这很棘手,但如果一个人对涉及的java.io和java.nio API不是100%熟悉,那么很有可能会把它塞满。(例如:未翻转缓冲区;缓冲区/文件边缘大小写错误)

如果您正在寻找一个在字节缓冲区中访问此文件的简单方法,请考虑使用.< /P>


在这种情况下使用MBB的好处在于,它不一定会将整个缓冲区实际加载到内存中,而是只加载正在访问的部分。

只有映射的部分可以通过该缓冲区访问。把它想象成一个覆盖整个文件的窗口,只有可见区域可以读(写)@bestsss:你应该把它作为一个答案添加进去。@Jonas,…不喜欢一句话中的答案。答案也很明显。提问者总是可以自己回答并选择它。我知道缓冲区不会增长,我的问题是在我消费时是否会用新数据更新它,javadoc在这方面并不清楚。
RandomAccessFile raf = new RandomAccessFile(file, "r");
FileChannel fc = raf.getChannel();
MappedByteBuffer buffer = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());