【问题标题】:Is PrintWriter buffered?PrintWriter 是否缓冲?
【发布时间】:2015-11-17 14:30:27
【问题描述】:

我知道PrintWriter如果我们想写格式化数据真的很好,我也知道使用BufferedWriter提高IO性能。

但我尝试过这样的事情,

PrintWriter pw = new PrintWriter(System.out);
pw.println("Statement 1");
pw.println("Statement 2");
//pw.flush();

我观察到当 flush 方法被注释时没有输出,但是当我取消注释时,我得到了想要的输出。

这只有在 PrintWriter 被缓冲的情况下才有可能。如果是这样,那么使用 BufferedWriter 包装 PrintWriter 然后写入它的意义何在?

虽然 javadoc 没有提到 PrintWriter 被缓冲的任何地方,但似乎是这样。

【问题讨论】:

  • 所有写入器都有flush方法。

标签: java file-io java-io printwriter bufferedwriter


【解决方案1】:

我检查了从 1.6.0_45 开始的 JDK 版本,它们都有 this 构造函数存在:

/**
 * Creates a new PrintWriter from an existing OutputStream.  This
 * convenience constructor creates the necessary intermediate
 * OutputStreamWriter, which will convert characters into bytes using the
 * default character encoding.
 *
 * @param  out        An output stream
 * @param  autoFlush  A boolean; if true, the <tt>println</tt>,
 *                    <tt>printf</tt>, or <tt>format</tt> methods will
 *                    flush the output buffer
 *
 * @see java.io.OutputStreamWriter#OutputStreamWriter(java.io.OutputStream)
 */
public PrintWriter(OutputStream out, boolean autoFlush) {
this(new BufferedWriter(new OutputStreamWriter(out)), autoFlush);

因此 PrintWritter 使用缓冲输出。如果您想使用您指出的代码,您可以创建 PrintWriter 并将 autoflush 设置为 true,这将确保使用 println 之一, printfformat 方法将刷新流。因此,在给定的上下文中,您的代码将如下所示:

PrintWriter pw = new PrintWriter(System.out, true);
pw.println("Statement 1");
pw.println("Statement 2");

【讨论】:

  • 好吧,只是想指出,如果 Java 规范中没有提到 PrintWriter 应该使用缓冲区,那么在未来的 Java 版本中可能不会如此。实施可以改变。我很确定这被称为抽象或封装 - 但不确定是哪个。
  • @JohnRed 感谢您的评论,如果您认为回复可以改进,请编辑。
【解决方案2】:

来自 PrintWriter 的 Java 8 源代码

/**
 * Creates a new PrintWriter from an existing OutputStream.  This
 * convenience constructor creates the necessary intermediate
 * OutputStreamWriter, which will convert characters into bytes using the
 * default character encoding.
 *
 * @param  out        An output stream
 * @param  autoFlush  A boolean; if true, the <tt>println</tt>,
 *                    <tt>printf</tt>, or <tt>format</tt> methods will
 *                    flush the output buffer
 *
 * @see java.io.OutputStreamWriter#OutputStreamWriter(java.io.OutputStream)
 */
public PrintWriter(OutputStream out, boolean autoFlush) {
    this(new BufferedWriter(new OutputStreamWriter(out)), autoFlush);

您可以看到 PrintWriter 使用 BufferedWriter 并且它有一个选项autoFlush,只有在缓冲时才有意义。

【讨论】:

    【解决方案3】:

    PrintWriter 被缓冲。不同之处在于PrintWriter 提供了方便的方法来编写对象的格式化字符串表示形式,例如println()printf()。它还具有自动刷新功能(显然它有一个缓冲区)。

    这两个课程都很有效。如果启用PrintWriter 的自动刷新,那么它可能会更少(因为每次调用println() 之类的东西时它都会刷新)。另一个区别是PrintWriter 并不能真正让你直接写字节。

    【讨论】:

    • PrintWriter 也有写入方法。 “另一个区别是 PrintWriter 并没有真正让你直接写字节”:我不明白这个说法。
    【解决方案4】:

    我认为由于 PrintWriter 也可以一次读取字符串,因此它将使用缓冲区。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-31
      • 1970-01-01
      • 1970-01-01
      • 2011-03-22
      • 2015-02-11
      • 1970-01-01
      相关资源
      最近更新 更多