2009-12-16 34 views
3

我正在對正在使用的庫進行一些更改。爲了減少內存使用量,磁帶庫將其臨時數據寫入磁盤,而不是將其保存在內存中。但是,對於我的使用場景,將其保存在內存中效率更高。它也有一些併發問題,因爲它的臨時文件具有不變的名稱,因此不能在不同的線程中同時運行(因爲線程會損壞對方的數據)。Java的FileChannel內存版本

因此,我需要更改庫,以便它將所有數據保存在內存中。我最初並沒有編寫這個庫,因此我對編寫代碼做出了很大的改變並不是很舒服。因此,我希望儘可能少地進行重構。寫入磁盤的代碼非常簡單。這裏的一個(稍微簡化的)例子:

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

塊的讀數是非常相似的(即,它使用一個FileChannel,它從一個RandomAccessFile的所得到的)。

感覺最簡單的解決方案是如果我可以使用FileChannel的一些實現,FileChannel映射到內存中的某個位置而不是文件。我知道我可以使用FileChannel的map-method將文件映射到內存中的某個位置。但是,這是另一回事。這給了我一個「內存API」文件。我想要一個針對某些內存的FileChannel接口。有沒有可用的實現?

回答

2

Java 7將允許可插入的文件系統,因此您可以使用基於內存的文件系統並保留當前的FileChannel API。除此之外,您可能不得不像Adrian所建議的那樣將您使用的API更改爲Commons-VFS,或者只使用內存結構。