为什么PrintWriter.print(string)方法不会将文本流式传输到输出文件中并在写下文本之前等待关闭?

时间:2014-09-01 01:31:11

标签: java output printwriter

我有以下代码:

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中预先存在的内容吗?

2 个答案:

答案 0 :(得分:3)

如何不覆盖上一个文件

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

如何自动刷新?

PrintWriter有一个构造函数,它需要一个额外的布尔值来设置autoflush

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();

答案 1 :(得分:1)

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();

它会起作用吗?