Java的FileChannel的内存版本

时间:2009-12-16 14:41:54

标签: java nio memory-mapped-files filechannel random-access

我正在对我正在使用的库进行一些更改。为了减少内存使用量,库正在将其临时数据写入磁盘,而不是将其保留在内存中。但是,对于我的使用场景,将其保留在内存中会更有效。它也有一些并发问题,因为它的临时文件具有常量名称,因此不能在不同的线程中并发运行(因为线程会破坏彼此的数据)。

因此我需要更改库,以便将所有数据保存在内存中。我最初没有编写库,因此我对代码的重大改动不太满意。因此,我希望尽可能少地进行重构。写入磁盘的代码非常简单。这是一个(有点简化)的例子:

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

块的读取非常相似(即它使用FileChannel,它从RandomAccessFile获取)。

感觉最简单的解决方案就是如果我可以使用FileChannel的一些实现,它会映射到内存中的某个位置而不是文件。我知道我可以使用FileChannel的map-method将文件映射到内存中的某个位置。然而,这是相反的方式。这给了我一个文件的“内存API”。我想要一个针对某些内存的FileChannel接口。有没有可用的实现?

2 个答案:

答案 0 :(得分:2)

Java 7将允许可插拔文件系统,因此您将能够使用基于内存的文件系统并保留当前的FileChannel API。除此之外,您可能不得不像Adrian建议的那样将您使用的API更改为Commons-VFS,或者仅使用内存结构。

答案 1 :(得分:1)

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