我有以下代码:
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 方法在有效地将文本写入文件之前等待 close 方法调用。
这对我来说非常糟糕,是否有其他方法可以使用 java 将文本写入文件而不会出现此问题?
编辑:flush()方法完成了这项工作,感谢评论。另外有人可以告诉我如何防止 PrintWriter logput = new PrintWriter("path\\log.txt", "UTF-8");
删除 log.txt 中预先存在的内容吗?
最佳答案
如何不覆盖以前的文件
如果您使用 OutputStream
构造函数而不是 File 构造函数,则可以创建自己的 FileOutputStream
实例,该实例使用告诉输出流追加而不是覆盖的构造函数。 http://docs.oracle.com/javase/7/docs/api/java/io/FileOutputStream.html
如何自动刷新?
PrintWriter
有一个构造函数,需要一个额外的 boolean 值来设置自动刷新
将这些放在一起:
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();
关于java - 为什么方法 PrintWriter.print(string) 不将文本流式传输到输出文件中并等待关闭后再写下文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25597839/