【问题标题】:Bufferedwriter works, but file empty?Bufferedwriter 工作,但文件为空?
【发布时间】:2013-09-02 13:03:46
【问题描述】:

我有以下代码:

CSVmaker(LinkedList data) {
    String [] myLines = makeStrings(data);
  //  for (int k = 0; k<myLines.length; k++)
  //  System.out.println(myLines[]);




    this.file = new File("rawdata.csv");
        try {
            BufferedWriter buff = new BufferedWriter(new FileWriter(file));
            for (int i = 0; i<myLines.length; i++){
                buff.write(myLines[i]);
                buff.newLine();
                System.out.println("done");
            }
        } catch (IOException ex) {
          System.out.println("except");
        }



}

不,我检查了 myLines 的内容,这些都是正确的。

另外,我得到的打印件打印“完成”的频率与我应该的一样多。 csv 已创建。

但是,如果我手动打开它,它是空的。

这可能是什么原因?

【问题讨论】:

标签: java file bufferedwriter


【解决方案1】:

您永远不会刷新缓冲区,或关闭 BufferedWriter。

在 for 循环之后,进行以下调用:

buff.flush();
buff.close();

即使有其他资源,完成后关闭它们也是一个好主意。

【讨论】:

  • 关闭实际上应该在 finally 块中完成,因为即使循环中发生任何异常,文件描述也应该关闭。如果使用 Java 7,则应首选 try-with-resources 语句。
  • @JBNizet 是的,为了 OP 的清晰性,我保持简单。
  • 哇,我只洗了 10 分钟的澡,就得到了 2 个正确答案。因为我想我不能投票给 2 我只是投票给谁是第一个,如果可以的话。虽然还没有设法最终加入 - 如果我这样做了,我会得到“找不到变量 buff”
  • 遇到了一个问题,即某些字符串在文件中显示而不使用 flush() 而有些则没有。经过进一步调查,我发现如果字符串的大小大于定义的内部限制,则缓冲区写入器会输出到没有 flush() 提示的文件。
  • flush()close() 之前是多余的。
【解决方案2】:

你必须在使用后close()流。
写循环后调用buff.close(); BufferedWriter 将在关闭时将数据刷新到文件。

【讨论】:

    【解决方案3】:

    虽然问题已经回答了。我想补充一下缓冲区的工作原理。

    每当您尝试使用缓冲区写入文件时,您写入的内容都会被添加到缓冲区中。当缓冲区已满时,内容将写入文件。通过这种方式,我们减少了对硬盘驱动器的命中次数,从而提高了效率。

    如果我们想在缓冲区未满的情况下强制写入文件,我们使用 flush() 方法。

    【讨论】:

      【解决方案4】:

      从 Java 8 开始,只需尝试使用资源即可,它会自动关闭 BufferedWriter。另请参阅新类 Files 的用法

      try (BufferedWriter writer = Files.newBufferedWriter(somePath, yourCharset)){
          writer.write(output);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-13
        • 2013-01-05
        • 1970-01-01
        • 2014-02-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多