【问题标题】:Why is there no autoflush parameter in PrintWriter when I write to file directly?为什么直接写入文件时PrintWriter中没有autoflush参数?
【发布时间】:2021-02-23 05:59:07
【问题描述】:

由于PrintWriter 被缓冲,我们需要刷新其数据或使用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 不存在。很奇怪,不是吗?

【问题讨论】:

  • 如果您使用File 参数,也不会自动刷新。如果你觉得这很奇怪,那你的奇怪标准是极低的。
  • 这条评论真的能帮助我理解我的问题吗?
  • 我认为归结为一个问题:API 应该提供所有可能的用例还是应该包含最重要的用例(这意味着有时您必须自己实现很少使用的功能)跨度>
  • 关闭前的 Flsuh 总是多余的。如果流没有被缓冲,它什么也不做,如果是,close() 调用flush()。有关编程语言“缺失”功能的问题应向设计人员提出。您在这里得到的只是或多或少不知情的猜测。

标签: java buffer iostream flush printwriter


【解决方案1】:

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

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

刷新发生在缓冲区已满和写入器关闭时。对于正是您想要的文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-04
    • 2021-09-08
    • 2019-09-13
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    相关资源
    最近更新 更多