Yrl*_*lec 7 java nio filechannel random-access memory-mapped-files
我正在对我正在使用的库进行一些更改。为了减少内存使用,库将其临时数据写入磁盘而不是将其保存在内存中。然而,对于我的使用场景来说,将其保留在内存中会更有效。它还存在一些并发问题,因为它的临时文件具有常量名称,因此不能在不同线程中同时运行(因为线程会损坏彼此的数据)。
因此,我需要更改库,以便将所有数据保留在内存中。我最初并没有编写该库,因此我不太愿意对代码进行大幅更改。因此,我希望通过尽可能少的重构来做到这一点。写入磁盘的代码非常简单。这是一个(稍微简化的)示例:
final FileChannel fileChannel = this.randomAccessFile.getChannel();
fileChannel.position(calculatePosition());
while (blockData.hasRemaining())
{
fileChannel.write(blockData);
}
Run Code Online (Sandbox Code Playgroud)
块的读取非常相似(即它使用从 RandomAccessFile 获取的 FileChannel)。
感觉最简单的解决方案是如果我可以使用 FileChannel 的某种实现,它映射到内存中的某个位置而不是文件。我知道我可以使用 FileChannel 的映射方法将文件映射到内存中的某个位置。然而,事实恰恰相反。这给了我一个文件的“内存API”。我想要一个针对某些内存的 FileChannel 接口。有没有可用的实现?
Java 7 将允许可插入文件系统,因此您将能够使用基于内存的文件系统并保留当前的 FileChannel API。除此之外,您可能必须按照 Adrian 的建议将使用的 API 更改为 Commons-VFS,或者使用仅内存结构。
根据此问题的 2023 年更新进行编辑,询问是否可以在没有外部库的情况下完成此操作...我怀疑这是错误的问题,因为FileChannel总是专门连接到文件对象。
FileChannel主要由一组实现的接口组成......
ByteChannel特别是,您可能对或ReadableByteChannel的功能感兴趣
SeekableByteChannel,所有这些功能都占用相当小的空间。ByteBufferChannel创建一个实现其中之一的程序将非常容易。
只需编写您的代码,期望 aFileChannel代替您关心的实际 java 接口,并且您可以互换地传递 aFileChannel或建议的ByteBufferChannelin 。