我知道如果我们想要编写格式化数据,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被缓冲的任何地方,但似乎是这样。
答案 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}之一},println或printf方法会刷新流。因此,您的代码在给定的上下文中看起来像这样:
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也可以立即读取字符串,因此它将使用缓冲区。