我有一个文本编辑器,它使用与下面几乎相同的代码来进行阅读和写作。当我打开小文件进行编辑时,当我尝试再次保存它们时总是会出现此错误。真正有趣的是,我的文本编辑器可以很好地处理大约 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();
}
}
}
对于上面的代码,对于从 4 字节到 10kb 的各种大小的 test.txt,我都得到了这个错误:
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 阅读的同时让它工作吗?
最佳答案
Stephen C告诉你取消映射缓冲区。
然而,这里有一个link仍然开放(从 2002 年开始)请求 MappedBybeBuffer.unmap 方法。
它有一些建议的解决方法,因此您可以尝试一下。
关于java - 在使用 java nio 读取的同一文件上打开 FileOutputStream 时出现 FileNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2146656/