【问题标题】:Outputting a String into a file, without clearing the file将字符串输出到文件中,而不清除文件
【发布时间】:2012-08-04 14:59:04
【问题描述】:

我一直在使用 BufferedWriter 对文本文件进行“记录”,但遇到了一个问题:

我运行以下代码..相当基本..

BufferedWriter out = new BufferedWriter(new FileWriter(path+fileName));
String str = "blabla";
out.write(str);
out.close();

接下来我知道的是,包含几行文本的整个文件已被清除,只有 'blabla' 存在。

我应该使用什么类让它添加一个带有文本“blabla”的新行,而不必将整个文件文本转换为字符串并将其添加到“blabla”之前的“str”?

【问题讨论】:

    标签: java


    【解决方案1】:

    我应该使用什么类让它添加一个带有文本“blabla”的新行,而不必将整个文件文本转换为字符串并将其添加到“blabla”之前的“str”?

    您正在使用正确的类(好吧,也许 - 见下文) - 您只是没有检查构造选项。您希望 FileWriter(String, boolean) 构造函数重载,其中第二个参数确定是否附加到现有文件。

    但是:

    • 我一般建议不要使用FileWriter,因为您不能指定编码。虽然很烦人,但最好使用 FileOutputStream 并将其包装在具有正确编码的 OutputStreamWriter 中。
    • 不要使用path + fileName 来组合目录和文件名,而是使用File

      new File(path, fileName);
      

      这让核心库可以处理不同的目录分隔符等。

    • 确保使用 finally 块关闭输出(这样即使抛出异常也能进行清理),如果您使用的是 Java 7,则使用“try-with-resources”块。

    所以把它们放在一起,我会使用:

    String encoding = "UTF-8"; // Or use a Charset
    File file = new File(path, fileName);
    BufferedWriter out = new BufferedWriter(
        new OutputStreamWriter(new FileOutputStream(file, true), encoding));
    try {
       out.write(...);
    } finally {
       out.close()'
    }
    

    【讨论】:

    • Snap,从未注意到它还有另一个构造函数。我会把这些 cmets 记在心里,谢谢。
    【解决方案2】:

    尝试使用 FileWriter(filename, append),其中 append 为真。

    【讨论】:

      【解决方案3】:
      try {
          PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("outfilename", true)));
          out.println("the text");
          out.close();
      } catch (IOException e) {
          //oh noes!
      }
      

      以上应该可以工作:Source Reference

      【讨论】:

      • 如果可能的话,我会避免使用PrintWriter...您真的希望默默地吞下异常吗?
      • 为什么要避免呢?如果需要,您可以调用“checkErrors()”。虽然你是对的,但这并不是绝对必要的,如果有问题,可以简单地删除它。
      • 如果你要打电话给checkErrors(),为什么还要使用PrintWriter呢?使用PrintWriter 有什么好处?它给你带来的一切(你实际上应该想要)是编写换行符的便捷方式。我宁愿不要仅仅为此而放弃“默认情况下”的例外。
      • 这就是我上一条评论中如果需要的来源。这是一个convenience class,如果他正在做简单的日志记录,你并不总是希望或需要抛出异常。但是,如果他担心它,那么删除它是最好的选择,你是对的。
      猜你喜欢
      • 1970-01-01
      • 2011-03-15
      • 1970-01-01
      • 1970-01-01
      • 2019-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-29
      相关资源
      最近更新 更多