複数のクライアントからの特定の情報を単一のファイルに追加するJavaサーバーがあります。したがってFileWriter
、append = trueを使用してPrintWriter
、autoFlush=trueを使用してを作成しています。ただし、ファイルを監視すると(たとえば、tailコマンドを使用して)、コンテンツはすぐには書き出されません。通常、10〜30秒の遅延があります。サーバーは、JDK1.764bを搭載した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-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の非同期/nfsマウントです。サーバーがファイルを書き込むディレクトリは、非同期nfsとしてマウントされます
... ... nfs vers=3,async,rw,rsize=32768,wsize=32768 0 0
ファイルを/tmpに切り替えた後、ファイルの追加はすぐに行われます。