Как удалить файл из памяти, отображенной с помощью FileChannel в Java? - PullRequest
39 голосов
/ 04 июня 2010

Я отображаю файл ("sample.txt") в память, используя FileChannel.map(), а затем закрываю канал, используя fc.close(). После этого, когда я пишу в файл с помощью FileOutputStream, я получаю следующую ошибку:

java.io.FileNotFoundException: sample.txt (Запрошенная операция не может быть выполнено для файла с пользовательский раздел открыт) * ​​1006 *

File f = new File("sample.txt");
RandomAccessFile raf = new RandomAccessFile(f,"rw");
FileChannel fc = raf.getChannel();
MappedByteBuffer mbf = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());
fc.close();
raf.close();

FileOutputStream fos = new FileOutputStream(f);
fos.write(str.getBytes());
fos.close();

Полагаю, это может быть связано с тем, что файл все еще отображается в памяти даже после закрытия FileChannel. Я прав?. Если так, как я могу «удалить» файл из памяти? (Я не могу найти какие-либо методы для этого в API). Спасибо.

Edit: Похоже, это (добавление метода unmap) было представлено как RFE для Sun некоторое время назад: http://bugs.sun.com/view_bug.do?bug_id=4724038

Ответы [ 12 ]

0 голосов
/ 05 августа 2013

Правильным решением здесь является использование try-with-resources.

Это позволяет создавать канал и другие ресурсы, которые можно ограничить блоком. Как только блок выходит, канал и другие ресурсы исчезают и впоследствии не могут быть использованы (так как ничто не имеет на них ссылку).

Отображение памяти по-прежнему не будет отменено до следующего запуска GC, но, по крайней мере, нет никаких висящих ссылок на него.

0 голосов
/ 01 августа 2013

Если объект сопоставленного файлового буфера может быть гарантированно пригоден для сбора мусора, вам не нужно собирать всю виртуальную машину для получения освобождения отображенной памяти буфера. Вы можете вызвать System.runFinalization (). Это вызовет метод finalize () для объекта буфера сопоставленного файла (если на него нет ссылок в потоках приложения), который освободит сопоставленную память.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...