为什么我直接写入文件时PrintWriter中没有autoflush参数?

Why is there no autoflush parameter in PrintWriter when I write to file directly?

由于 PrintWriter 被缓冲,我们需要 flush 其数据或使用 autoflush(布尔参数)。如果我们不这样做,我们的数据只会在整个缓冲区变满时写入。

我们可以这样做:

PrintWriter pw = new PrintWriter (new FileWriter ("test.txt"));
        pw.println ("hello");
        pw.flush ();

或者像这样使用autoflush

PrintWriter pw = new PrintWriter (new FileWriter ("test.txt"),true);
        pw.println ("hello");

我的问题如下:为什么如果我直接用 PrintWriter 写入 file 就没有 autoflushing 这样的选项?所以如果我这样做,它不会编译:

PrintWriter pw1 = new PrintWriter ("test.txt",true); 
//'Cannot resolve constructor 'PrintWriter(java.lang.String, boolean)'
        pw1.println ("hey");

为什么我们没有提供那种类型的构造函数?有什么我想念的吗?如果我直接写入 file,我必须手动使用 flush() 方法,而 autoflush 不存在。很奇怪,不是吗?

不,这不是特别奇怪。 API 充满了差异,原因从 non-obvious to non-obvious to unknown

由于刷新速度很慢,因此您几乎没有理由想要在每一行之后显式刷新(例如 tail -f 正在写入的文件,大缓冲区,但打印量少,因此需要缓冲区填充和结果显示需要很长时间)。由于这些构造函数(StringFile)是在 Java 5 中添加的,因此自动刷新很可能被认为是不必要的,即使它破坏了与其他构造函数的一致性(因为 Java 1.1).

当缓冲区已满且编写器关闭时会发生刷新。对于正是您想要的文件。