即使使用autoFlush,PrintWriter也不会立即刷新

时间:2012-11-24 22:37:04

标签: java append printwriter autoflush

我有一台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后,立即追加文件。

0 个答案:

没有答案