learner135 learner135 - 1 month ago 24
Java Question

How to unmap a file from memory mapped using FileChannel in java?

I am mapping a file("sample.txt") to memory using

FileChannel.map()
and then closing the channel using
fc.close()
. After this when I write to the file using FileOutputStream, I am getting the following error:


java.io.FileNotFoundException:
sample.txt (The requested operation
cannot be per formed on a file with a
user-mapped section open)


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();


I presume this may be due to file being still mapped to the memory even after I close the
FileChannel
. Am I right?. If so, how can I "unmap" the file from memory?(I can't find any methods for this in the API).
Thanks.

Edit:
Looks like it(adding an unmap method) was submitted as RFE to sun some time back:
http://bugs.sun.com/view_bug.do?bug_id=4724038

Answer

From the MappedByteBuffer javadoc:

A mapped byte buffer and the file mapping that it represents remain valid until the buffer itself is garbage-collected.

Try calling System.gc()? Even that's only a suggestion to the VM.