我有一台Java服务器,它将来自多个客户端的某些信息附加到单个文件中。所以我创建了一个带有append = true的FileWriter
和一个带有autoFlush = true的PrintWriter
。但是,当我监视(例如,使用tail命令)文件时,内容不会立即写出,通常会有10-30秒的延迟。服务器在Linux上运行,JDK 1.7 64b。为什么autoflush在这里不起作用?如何在文件中立即提供数据?
//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上,在app输出该行之后,在该行可以在另一个终端中查看之前(使用tail -f),有一个明显的延迟(~1-2s)。在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-04:
我想我找到问题的根本原因。它实际上是Linux上的async / nfs挂载。服务器写入文件的目录作为async nfs
挂载... ... nfs vers=3,async,rw,rsize=32768,wsize=32768 0 0
将文件切换到/ tmp后,立即追加文件。