PrintWriter是缓冲的吗?

时间:2015-08-24 08:30:11

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

我知道如果我们想要编写格式化数据,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被缓冲的任何地方,但似乎是这样。

4 个答案:

答案 0 :(得分: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);

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

答案 1 :(得分:6)

我检查了从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 ,这将确保使用{{3}之一},printlnprintf方法会刷新流。因此,您的代码在给定的上下文中看起来像这样:

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

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