4

我有以下代码:

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 已创建。

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

这可能是什么原因?

4

4 回答 4

14

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

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

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

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

于 2013-09-02T13:05:13.403 回答
4

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

于 2013-09-02T13:05:29.417 回答
2

虽然问题得到了回答。我想添加缓冲区的工作原理。

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

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

于 2014-01-16T07:14:48.323 回答
0

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

try (BufferedWriter writer = Files.newBufferedWriter(somePath, yourCharset)){
    writer.write(output);
}
于 2020-04-16T11:35:04.150 回答