PrintWriter是缓冲的吗?

Ari*_*Roy 6 java file-io bufferedwriter printwriter java-io

我知道PrintWriter如果我们想要编写格式化数据,那真的很好,而且我也知道使用它BufferedWriter来提高IO性能.

但我试过这样的事,

PrintWriter pw = new PrintWriter(System.out);
pw.println("Statement 1");
pw.println("Statement 2");
//pw.flush();
Run Code Online (Sandbox Code Playgroud)

我观察到当注释flush方法时没有输出,但是当我取消注释它时,我得到了所需的输出.

只有在PrintWriter被缓冲时才可以这样做.如果是这样,那么使用BufferedWriter包装PrintWriter然后编写它有什么意义呢?

虽然javadoc没有提到PrintWriter被缓冲的任何地方,但似乎如此.

Pet*_*rey 8

来自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);
Run Code Online (Sandbox Code Playgroud)

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


Oli*_*POP 8

我检查了从1.6.0_45开始的JDK版本,所有这些版本都有这个构造函数:

/**
 * 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);
Run Code Online (Sandbox Code Playgroud)

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

PrintWriter pw = new PrintWriter(System.out, true);
pw.println("Statement 1");
pw.println("Statement 2");
Run Code Online (Sandbox Code Playgroud)