我有以下代码:
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();
它行得通吗?