为什么方法PrintWriter.print(string)不将文本流式传输到输出文件中,而是等待关闭后再写下文本?



我有以下代码:

PrintWriter logput = new PrintWriter("path\log.txt", "UTF-8");
for (String symb : symbolList) {
System.out.println(symb);
logput.println(symb);
}
logput.close();

for循环运行了几个小时,所以我最终不得不停止程序。当我检查log.txt时,它是空的,而System.out在每次迭代时都会毫无问题地打印symb值。这意味着println方法在有效地将文本写入文件之前等待关闭方法调用。

这对我来说非常糟糕,有没有其他方法可以用java将文本写入文件中而不存在这个问题?

Edit:flush()方法完成了这项工作,感谢评论。另外,可以告诉我如何防止PrintWriter logput = new PrintWriter("path\log.txt", "UTF-8");删除log.txt中预先存在的内容吗?

如何不覆盖以前的文件

如果使用OutputStream构造函数而不是File构造函数,则可以创建自己的FileOutputStream实例,该实例使用告诉outputstream附加而不是覆盖的构造函数。http://docs.oracle.com/javase/7/docs/api/java/io/FileOutputStream.html

如何自动刷新

PrintWriter有一个构造函数,它使用一个额外的布尔值来设置自动刷新

http://docs.oracle.com/javase/7/docs/api/java/io/PrintWriter.html#PrintWriter%28java.io.OutputStream,%20boolean%29

把这些放在一起:

PrintWriter logput = new PrintWriter(new FileOutputStream("path\log.txt", true),  true);
for (String symb : symbolList) {
   System.out.println(symb);
   logput.println(symb);
 }
 logput.close();

如果你需要使用UTF-8字符集,你必须制作自己的OutputStreamWriter

//boolean here is for append
Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("path\log.txt", true), "UTF-8"))
 //boolean here is for autoflush
 PrintWriter logput = new PrintWriter(writer,  true);
for (String symb : symbolList) {
   System.out.println(symb);
   logput.println(symb);
 }
 logput.close();
FileOutputStream outputStream = new FileOutputStream("path\log.txt", true);
PrintWriter logput = new PrintWriter(outputStream, true);
for (String symb : symbolList) {
    System.out.println(symb);
    logput.println(symb);
}
logput.close();

它行得通吗?

最新更新