2

我有一个 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 后,文件附加现在是立即的。

4

0 回答 0