我有一个 Java 服务器,它将来自多个客户端的某些信息附加到一个文件中。所以我正在创建一个FileWriter
带有 append=true 和一个PrintWriter
带有 autoFlush=true 的。但是,当我监视(例如,使用 tail 命令)文件时,内容不会立即写出,通常会有 10-30 秒的延迟。该服务器在带有 JDK 1.7 64b 的 Linux 上运行。为什么自动刷新在这里不起作用?如何使文件中的数据立即可用?
//Create appendable FileWriter, and autoflushable PrintWriter
PrintWriter pw = new PrintWriter(new FileWriter(file, true), true);
... ...
if (save2File) {
//println(String) supposed to flush the content
pw.println(getEventOutput(event));
// adding flush still not working!
pw.flush();
}
这是重现问题的代码。在 Linux 上,在应用程序输出该行之后和在另一个终端中可以看到该行之前(使用 tail -f),有一个明显的延迟(~1-2 秒)。在 Windows 上,输出似乎非常快(比我在 Notepad++ 中刷新文件的速度还快)
public static void main(String[] args) throws IOException,
InterruptedException {
long time = 5000;
File file = new File("xyz.test");
PrintWriter pw = new PrintWriter(new FileWriter(file, true), true);
for (int i = 0; i < 10; ++i) {
pw.println("this is line " + i);
System.out.println("output line " + i);
// Thread.sleep(time);
System.in.read();
}
System.in.read();
}
2012 年 12 月 4 日更新:
我想我找到了问题的根本原因。它实际上是 Linux 上的 async /nfs 挂载。服务器写入文件的目录挂载为 async nfs
... ... nfs vers=3,async,rw,rsize=32768,wsize=32768 0 0
在我将文件切换到 /tmp 后,文件附加现在是立即的。