1

这实际上是关于如何使用内存映射文件的三个问题。我所做的工作,但我错过了一个权威的答案。

我得到我的ByteBuffer喜欢如下:

raf = new RandomAccessFile(file, isReadonly ? "r" : "rw");
channel = raf.getChannel();
buffer = channel.map(mode, 0, channel.size());

对于调整大小,以下似乎有效

raf.setLength(newLength);
channel = raf.getChannel();

没有打电话raf.getChannel(),但它真的正确吗?


根据Javadoc,调用force应该刷新它(我使用的是本地驱动器)。我只是想知道它是如何声明不的IOException如果它失败了会发生什么?


我必须关闭什么?, RandomAccessFile,FileChannel或两者兼而有之?我必须打电话flushMappedByteBuffer.force之前打电话吗?

4

1 回答 1

0

对于调整大小,以下似乎有效

raf.setLength(newLength);
channel = raf.getChannel();

不调用 raf.getChannel(),但它真的正确吗?

是的。您无需重新获取频道。之后仍然有效setLength()

根据Javadoc,调用force()应该刷新它(我使用的是本地驱动器)。我只是想知道它是如何声明不IOException的,如果它失败了会发生什么?

您似乎在这里谈论MappedByteBuffer.force()。我无法解释设计师的选择。

我必须关闭什么?RandomAccessFile、FileChannel,还是两者兼而有之?

任何一位。

我必须打电话flush()MappedByteBuffer.force()之前打电话吗?

没有flush()。如果您愿意,可以致电force(),否则更改可能会延迟。

于 2017-02-14T02:49:18.820 回答