为什么当我直接写入文件时,PrintWriter 中没有自动刷新参数?

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

提问人:Stefan 提问时间:11/11/2020 更新时间:11/12/2020 访问量:274

问:

由于是缓冲的,我们需要刷新其数据或使用自动刷新(布尔参数)。如果我们不这样做,我们的数据将仅在整个缓冲区已满时写入。PrintWriter

我们可以做这样的事情:

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

或者像这样使用自动冲洗

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

我的问题如下:为什么如果我直接写入文件,则没有这样的自动刷新选项?因此,如果我这样做,它将无法编译:PrintWriter

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

为什么我们没有提供这种类型的构造函数?我错过了什么吗?如果我直接写入文件,我必须在不存在的情况下手动使用方法。很奇怪,不是吗?flush()autoflush

Java 缓冲 IOSTREAM 刷新 打印器

评论

1赞 Kayaman 11/11/2020
如果使用 File 参数,则不会自动刷新。如果你觉得这很奇怪,那么你对怪异的标准是极低的。
0赞 Stefan 11/11/2020
这个评论真的会帮助我理解我的问题吗?
0赞 Thomas Kläger 11/11/2020
我认为这归结为一个问题:API 应该提供所有可能的用例,还是应该包括最重要的用例(这意味着有时您必须自己实现很少使用的功能)
1赞 user207421 11/12/2020
关闭前的 Flsuh 始终是多余的。如果流未缓冲,则不执行任何操作,如果缓冲,则调用 .关于编程语言中“缺失”功能的问题应该向设计人员提出。你在这里得到的只是或多或少不知情的猜测。close()flush()

答:

2赞 Kayaman 11/11/2020 #1

不,这并不是特别奇怪。API 充满了差异,原因从不明显到不明显再到未知

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

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