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

标签 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();
        }
    }
}

对于上面的代码,对于从 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/

相关文章:

Java NIO。 SocketChannel.read方法每次都返回0。为什么?

java - Reactor/WebFlux 实现了一个响应式的 http 新闻自动收报机

java - 将Json转换为hadoop的顺序文件

java - 向用户提供反馈的最佳方式是什么

java - 如何在 Rox NIO 教程中消除竞争条件

java - FileChannel 映射 - 无法扩展写入

java - 每个请求模型的线程能否比非阻塞 I/O 更快?

java - 将 List/Map 作为 POST 参数发送

java - 如何使用 JPA 和 DB2 将 DATETIME 列映射到 Date 对象

java - 如何手动加密套接字连接的流量?