Java的FileChannel的内存版本

ukxgm1gy  于 2023-03-28  发布在  Java
关注(0)|答案(2)|浏览(115)

我正在对我正在使用的库进行一些更改。为了减少内存使用,库将其临时数据写入磁盘而不是将其保存在内存中。然而,对于我的使用场景,将其保存在内存中更有效。它也有一些并发问题,因为它的临时文件名是常量,因此不能在不同的线程中并发运行(因为线程会破坏彼此的数据)。
因此,我需要更改库,使其将所有数据保存在内存中。我最初没有编写库,因此我不太习惯对代码进行剧烈更改。因此,我希望尽可能少地重构。写入磁盘的代码非常简单。下面是一个(稍微简化的)示例:

final FileChannel fileChannel = this.randomAccessFile.getChannel();
fileChannel.position(calculatePosition());
while (blockData.hasRemaining())
{
 fileChannel.write(blockData);
}

块的阅读非常相似(即,它使用FileChannel,它从RandomAccessFile获得)。
感觉最简单的解决方案是如果我可以使用FileChannel的一些实现,它Map到内存中的一个位置而不是文件。我知道我可以使用FileChannel的map方法将文件Map到内存中的一个位置。然而,这是相反的。这给了我一个文件的“memory API”。我想要一个针对一些内存的FileChannel接口。有没有可用的实现?

hmae6n7t

hmae6n7t1#

Java 7将允许可插拔的文件系统,所以你将能够使用基于内存的文件系统并保留当前的FileChannel API。否则,你可能不得不像Adrian建议的那样将你使用的API更改为Commons-VFS,或者使用仅内存的结构。
根据2023更新编辑这个问题,询问是否可以在没有外部库的情况下完成......我怀疑这是一个错误的问题,因为FileChannel总是专门连接到一个文件对象。
FileChannel主要由一组已实现的接口组成...
特别是,您可能对ByteChannelReadableByteChannelSeekableByteChannel的功能感兴趣,它们都具有相当小的占用空间。创建实现其中一个的ByteBufferChannel非常容易。
只需编写代码,期望使用您关心的实际Java接口FileChannel,您可以传递FileChannel或建议的ByteBufferChannel

axzmvihb

axzmvihb2#

也许您可以使用内存中的文件系统,例如Apache Commons VFS

相关问题