2009-12-16 5 views
3

Я в процессе внесения некоторых изменений в библиотеку, которую я использую. Чтобы уменьшить использование памяти, библиотека записывает свои временные данные на диск, а не сохраняет их в памяти. Однако для моего сценария использования более эффективно хранить его в памяти. Он также имеет некоторые проблемы с параллелизмом, поскольку он имеет постоянные имена для своих временных файлов и поэтому не может одновременно запускаться в разных потоках (поскольку потоки повреждают данные друг друга).In-memory версия FileChannel Java

Поэтому мне необходимо изменить библиотеку, чтобы она сохраняла все свои данные в памяти. Я изначально не писал библиотеку, и поэтому мне не очень удобно делать радикальные изменения в коде. Поэтому я хотел бы сделать это с минимальным рефакторингом. Код, который записывает на диск, довольно прост. Вот (несколько упрощенный) пример:

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

Считывание блока очень похож (т.е. он использует FileChannel, который он получает от RandomAccessFile).

Похоже, что самое легкое решение было бы, если бы я мог использовать некоторую реализацию FileChannel, которая сопоставляется с местом в памяти, а не файлом. Я знаю, что могу сопоставить файл в месте в памяти с помощью Map-метода FileChannel. Однако это наоборот. Это дает мне «память-API» для файла. Мне нужен интерфейс FileChannel для некоторой памяти. Существуют ли какие-либо доступные варианты этого?

ответ

2

Java 7 позволит подключаемые файловые системы, поэтому вы сможете использовать файловую систему на основе памяти и поддерживать текущий API FileChannel. Короче говоря, вам, скорее всего, придется изменить API, который вы используете в Commons-VFS, поскольку Адриан предлагает или использует только структуры памяти.

1

Возможно, вы можете использовать файловую систему в памяти, такую ​​как Apache Commons VFS.