我正在使用
我猜这可能是因为关闭了
编辑: 看起来(添加取消映射方法)曾经作为RFE提交给Sun: https://bugs.java.com/bugdatabase/view_bug?bug_id=4724038
FileChannel.map()
将文件("sample.txt")映射到内存中,然后使用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提交给Sun: https://bugs.java.com/bugdatabase/view_bug?bug_id=4724038
OutOfMemoryError
错误,我认为这是文件句柄耗尽的结果。由于没有工具可以取消映射,这会导致不可预测的行为,即使在OutOfMemoryError
时,映射会尝试执行sleep(100)
和System.gc()
- 它只会推迟痉挛的发生。 - dma_k