文件编写器覆盖文件而不是附加到末尾的问题

Posted

技术标签:

【中文标题】文件编写器覆盖文件而不是附加到末尾的问题【英文标题】:Trouble with filewriter overwriting files instead of appending to the end 【发布时间】:2012-05-29 17:58:44 【问题描述】:

好的,我在将多行写入文本文件时遇到了一些问题。

程序运行,但不会每次都换行

当我希望它运行 4 次时,文本文件应如下所示:

a
b
c
d

相反,它看起来像:

d

谁知道如何解决这个问题?所有导入均正确导入。

来源(稍作编辑,假设一切都已正确定义):

import java.io.*;
public class Compiler 
public static void main (String args[]) throws IOException

    //there's lots of code here
    BufferedWriter outStream= new BufferedWriter(new FileWriter("output.txt"));
    outStream.newLine();
    outStream.write(output);
    outStream.close();



【问题讨论】:

只是一个警告,但这危险地接近于“什么是代码”问题。但是,既然你不是简单地寻求帮助(你展示了你到目前为止所做的事情),我会视而不见。 output 没有定义,所以这显然不会编译。我假设这会运行 4 次,每次都将 output 设置为字母表中的后续字母。显然,如果"a\nb\n\c\nd\n"output 的值,则解决方案将大不相同。 【参考方案1】:

确保在创建FileWriter 的实例时,将其附加到它的末尾。这可以通过使用this specific FileWriter constructor 来完成,它将一个额外的boolean 作为第二个参数。这个boolean 告诉FileWriter 追加到文件的末尾,而不是覆盖文件。

BufferedWriter outStream= new BufferedWriter(new FileWriter("encoded.txt", true));

【讨论】:

我对java的输入和输出有点陌生,我能举个例子吗?我现在不适合进行测试(此工作站上没有 JDK 或 IDE) 我的回答已经提供了您应该应用的更改以使其工作。 我是在没有代码的时候写的。谢谢你的回答。 我使用第二个参数作为 true 并且在应用程序的同一运行期间它很好地附加。但是当我再次启动同一个应用程序(第二个参数为真)时,它会破坏前一个运行会话的所有信息,然后再次很好地附加......虽然我尝试实现我自己的原始记录器并希望保留日志中的所有信息...有什么线索吗?【参考方案2】:

默认情况下FileWriter 将覆盖该文件。您可能想要做的是按以下方式定义阅读器:new FileWriter("encoded.txt", true) 这样,文件将被附加到,而不是被覆盖。 希望这会有所帮助!

【讨论】:

【参考方案3】:

我不确定这段代码应该做什么。如果您的输入字符串长度超过一个字符,则会引发错误,因为您在循环中关闭了 FileWriter,然后尝试再次写入。

我按以下方式解释您的问题:您想知道为什么文件中只有最新的输出。在这种情况下,这是因为您没有在附加模式下创建 FileWriter。查看可用于 FileWriter 的不同构造函数,并使用允许附加到文件的构造函数。

【讨论】:

以上是关于文件编写器覆盖文件而不是附加到末尾的问题的主要内容,如果未能解决你的问题,请参考以下文章

在 VBScript 中每次都附加到文件而不是覆盖文件

如何在复制粘贴时覆盖 VS Code 中的文件(而不是将 *.1* 附加到文件名)?

附加到文本文件(不覆盖!)

如何从SharedPreferences文件中正确地将文本附加到TextView而不是覆盖它?

为啥我的 for 循环覆盖而不是追加?

将抓取的数据附加到 JSON 文件