在使用java nio读取的同一文件上打开FileOutputStream时出现FileNotFoundException

时间:2010-01-27 12:05:25

标签: java nio

我有一个文本编辑器,它使用与下面几乎相同的代码进行读写。当我打开小文件进行编辑时,我总是在尝试再次保存时遇到此错误。真正有趣的是,我的文本编辑器适用于大约600字节或更多(似乎每次都有变化)的文件,我在这里无法复制的行为。

我目前的解决方法是检查文件大小< 1024字节,如果是这种情况则使用java.io。

import java.io.*;
import java.nio.*;
import java.nio.channels.*;
import java.nio.charset.*;

public class Test {
    public static void main(String[] args) {
        String text = null;
        try {
            FileInputStream fis = new FileInputStream("test.txt");
            FileChannel ifc = fis.getChannel();
            CharBuffer cb = Charset.forName("ISO-8859-15").newDecoder().
                    decode(ifc.map(FileChannel.MapMode.READ_ONLY, 0,
                    (int) ifc.size()));
            text = cb.toString();
            ifc.close();
            fis.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }

        try {
            FileOutputStream fos = new FileOutputStream("test.txt");
            OutputStreamWriter osw = new OutputStreamWriter(
                    fos, "ISO-8859-15");
            osw.write(text);
            osw.close();
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

对于上面的代码,我得到各种大小的test.txt从4个字节到10kb的错误:

java.io.FileNotFoundException: test.txt (The requested operation cannot be perfo
rmed on a file with a user-mapped section open)
        at java.io.FileOutputStream.open(Native Method)
        at java.io.FileOutputStream.<init>(Unknown Source)
        at java.io.FileOutputStream.<init>(Unknown Source)
        at Test.main(Test.java:23)

任何人都可以解释我做错了什么以及如何在仍然使用nio阅读时让它工作?

2 个答案:

答案 0 :(得分:2)

Stephen C告诉你取消映射缓冲区。

但是,这是一个link到STILL OPEN(从2002年开始)对MappedBybeBuffer.unmap方法的请求。

有一些建议的解决方法,所以你可以尝试一下。

答案 1 :(得分:0)

您需要使用FileChannel.map(...)调用显式取消映射您映射的区域。

map(...)的Javadoc说:

  

映射一旦建立,就不依赖于用于创建映射的文件通道。特别是关闭频道对映射的有效性没有影响。