为什么我直接写入文件时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
正在写入的文件,大缓冲区,但打印量少,因此需要缓冲区填充和结果显示需要很长时间)。由于这些构造函数(String
和 File
)是在 Java 5 中添加的,因此自动刷新很可能被认为是不必要的,即使它破坏了与其他构造函数的一致性(因为 Java 1.1).
当缓冲区已满且编写器关闭时会发生刷新。对于正是您想要的文件。
由于 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
正在写入的文件,大缓冲区,但打印量少,因此需要缓冲区填充和结果显示需要很长时间)。由于这些构造函数(String
和 File
)是在 Java 5 中添加的,因此自动刷新很可能被认为是不必要的,即使它破坏了与其他构造函数的一致性(因为 Java 1.1).
当缓冲区已满且编写器关闭时会发生刷新。对于正是您想要的文件。