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

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

最佳答案

如何不覆盖以前的文件

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

如何自动刷新?

PrintWriter 有一个构造函数,需要一个额外的 boolean 值来设置自动刷新

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

关于java - 为什么方法 PrintWriter.print(string) 不将文本流式传输到输出文件中并等待关闭后再写下文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25597839/

相关文章:

java - 如何在android中读取txt文件?

c# - 如何像 DebugView 应用程序一样读取 c# Debug.WriteLine?

c++ - 重置流但保留以前的数据

在方法之间传递的 Java 套接字

java - 将文件从 OS 拖放到 JTable java

javascript - 在 Java 中创建常见的 SQL 操作?

java - 修复无效响应后,扫描仪不允许我继续

java 使用 PrintWriter 将模式打印到文件

java - PrintWriter 不允许我进入特定目录

java - 尝试在 Spring + MySQL 中创建表之间的关系时出错