【问题标题】:FileInputStream and FileOutputStream: Read and write to the same fileFileInputStream 和 FileOutputStream:读写同一个文件
【发布时间】:2021-10-02 08:46:32
【问题描述】:

我创建了一个内容为“Hello”的文本文件,我试图从文件中读取这些字符并将其再次写回同一个文件。

假设: 1。该文件现在具有内容“Hello”(已覆盖) 2.文件现在有内容“HelloHello”(附加) 3. 文件现在有无限“Hello”的内容(或抛出异常)

实际结果: 原始的“Hello”字符从文本文件中删除,文件为空。

实际测试

    @Test
    public void testCopyStream() throws IOException {
        File workingDir = new File(System.getProperty("user.dir"));
        File testFile = new File(workingDir, "/test.txt");

        FileReader fin = new FileReader(testFile);
        FileWriter fos = new FileWriter(testFile);
        copyStream(fin, fos);
        fin.close();
        fos.close();
}

我创建了以下方法,用于将InputStream 中的数据“复制”到OutputStream

private void copyStream(Reader in, Writer out) throws IOException {
        int b;
        while ((b = in.read()) != -1) {
           out.write(b);
        }
    }

我尝试使用调试器找出问题所在,调试器显示 b = in.read() 在 while 循环的第一次迭代中被分配了 -1。然后我在检查文件内容的同时一步步执行代码,发现在 statementfinal FileWriter fos = new FileWriter(testFile); 执行后立即从文件中删除了“Hello”关键字。

我最初认为这是因为 InputStreamOutputStream 指向同一个文件,因此文件被 JVM “锁定”以保证执行安全?

所以我尝试交换这两行:

        FileWriter fos = new FileWriter(testFile);
        FileReader fin = new FileReader(testFile);
        

结果还是一样:文件内容在FileWriter fos = new FileWriter(testFile);声明之后就被删除了

我的问题是:为什么内容会被FileWriter 清除掉?。这是与 FileDescriptor 相关的一些行为吗?有没有办法读写同一个文件?

仅供参考,

  1. copyStream() 方法工作正常,我已经用其他测试对其进行了测试。
  2. 不是用append() 方法代替write()

【问题讨论】:

  • 您可以使用 Java 10 中的标准 API Reader.transferTo(Writer out)
  • 你想要这个为什么?为什么不把可怜的文件放在一边?

标签: java java-io


【解决方案1】:

语句FileWriter fos = new FileWriter(testFile); 截断现有文件。

使用流式访问来读取和写入同一个文件是没有意义的,因为这不会给出可靠的结果。如果您想读/写同一个文件,请使用 RandomAccessFile:这会调用寻找当前位置并在文件的不同位置执行读或写。

https://docs.oracle.com/javase/7/docs/api/java/io/RandomAccessFile.html

【讨论】:

    【解决方案2】:

    FileWriter 实际上会在写入之前删除文件中的所有内容。要保留文本,请使用

    new FileWriter(file, true);
    

    true 参数是文件写入器的附加参数。否则它只会覆盖所有内容

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-08
      相关资源
      最近更新 更多