内存映射文件Java NIO

ray*_*zag 2 java nio memory-mapped-files

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

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

例如,在我将SIZE设置为2MB的情况下,这是否意味着它将仅加载2MB的文件,或者它将在文件中进一步读取并更新缓冲区,因为我从中消耗了字节?

Stu*_*son 5

例如,在我将SIZE设置为2MB的情况下,这是否意味着它将仅加载2MB的文件,或者它将在文件中进一步读取并更新缓冲区,因为我从中消耗了字节?

它将仅加载缓冲区初始化中指定的文件部分。如果您希望它进一步读取,则需要进行某种读取循环。尽管我不会说这很棘手,但是如果不是100%熟悉所涉及的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());
Run Code Online (Sandbox Code Playgroud)

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