Как не отобразить файл из памяти отображенное использование FileChannel в Java?

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

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

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).Спасибо.

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

41
задан learner135 4 June 2010 в 10:52
поделиться

2 ответа

Из MappedByteBuffer javadoc:

Сопоставленный байтовый буфер и отображение файла, которое он представляет, остаются действительными, пока сам буфер не будет очищен от мусора.

Попробуйте вызвать System.gc()? Даже это лишь предложение для ВМ.

11
ответ дан 27 November 2019 в 00:46
поделиться

Сопоставленная память используется до тех пор, пока она не будет освобождена сборщиком мусора.

Из FileChannel docs

Сопоставление после его создания не зависит от файлового канала, который использовался для его создания. Закрытие канала, в частности, не влияет на достоверность отображения.

Из MappedByteBuffer java doc

Сопоставленный буфер байтов и сопоставление файлов, которое он представляет, остаются действительными до тех пор, пока сам буфер не будет собран мусором.

Поэтому я бы предложил убедиться, что не осталось ссылок на сопоставленный буфер байтов, а затем запросить сборку мусора.

0
ответ дан 27 November 2019 в 00:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: