我有以下代码:
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已创建。
但是,如果我手动打开它,它就是空的。
这可能是什么原因?
答案 0 :(得分:11)
您永远不会刷新缓冲区,也不会关闭BufferedWriter。
在for循环之后,进行以下调用:
buff.flush();
buff.close();
即使使用其他资源,完成后关闭它们也是一个好主意。
答案 1 :(得分:4)
使用后您必须close()
写循环后调用buff.close()
; BufferedWriter会在收盘时将数据刷新到文件。
答案 2 :(得分:1)
虽然回答了这个问题。我想补充一下缓冲区的工作原理。
每当您尝试使用缓冲区写入文件时,无论您编写什么内容都会添加到缓冲区中。当缓冲区已满时,内容将写入文件。这样我们就减少了硬盘驱动器的命中次数,从而提高了效率。
如果我们想在没有缓冲区变满的情况下强行写入文件,我们使用flush()方法。
答案 3 :(得分:0)
从Java 8开始,只需尝试使用资源即可完成操作,资源会自动关闭BufferedWriter。另请参阅新类文件的用法
try (BufferedWriter writer = Files.newBufferedWriter(somePath, yourCharset)){
writer.write(output);
}