Is PrintWriter buffered?
Asked Answered
D

4

9

I know that the PrintWriter is really good if we want to write formatted data, and I also know the use of BufferedWriter to improve IO performance.

But I tried something like this,

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

I observed that when the flush method is commented there is no output, but when I uncomment it, I get the desired output.

This is only possible if the PrintWriter is buffered. If so, then what is the point of wrapping a PrintWriter using a BufferedWriter and then writing it?

Though the javadoc doesn't mention anywhere that the PrintWriter is buffered, but it seems so.

Dainedainty answered 24/8, 2015 at 8:30 Comment(1)
all the writers have flush method.Caridadcarie
E
10

I checked JDK versions starting with 1.6.0_45 and all of them have this constructor present:

/**
 * 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);

Hence PrintWritter uses buffered output. If you would like to use the code you pointed out, you can create the PrintWriter with the autoflush set to true, that will ensure that using one of the println, printf or format methods would flush the stream. So, your code would look like this in the given context:

PrintWriter pw = new PrintWriter(System.out, true);
pw.println("Statement 1");
pw.println("Statement 2");
Euphorbiaceous answered 24/8, 2015 at 8:52 Comment(2)
Well, just want to point out that if it isn't mentioned anywhere in the Java specs that PrintWriter should use buffers, this might not remain so in the future Java versions. Implementations can change. I am pretty sure that this is called Abstraction or Encapsulation - not sure which though.Emporium
@JohnRed thank you for your comment, if you think the response can be improved, please edit it.Euphorbiaceous
M
8

From the Java 8 source for PrintWriter

/**
 * 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);

You can see that PrintWriter uses BufferedWriter and that it has an option autoFlush which would only make sense if it was buffered.

Mendez answered 24/8, 2015 at 8:36 Comment(0)
P
2

PrintWriter is buffered. The difference is that PrintWriter offers convenience methods for writing formatted string representations of objects like println() and printf(). It also has auto-flushing (so obviously it has a buffer).

Both classes are efficient. If you enable PrintWriter's auto flushing, then it may be less so (because it will flush every time you call something like println()). Another difference is that PrintWriter doesn't really let you write bytes directly.

Peneus answered 24/8, 2015 at 8:42 Comment(1)
PrintWriter too has write methods. "Another difference is that PrintWriter doesn't really let you write bytes directly" : I don't understand this statement.Consecutive
C
0

I think that since PrintWriter too can read the String at once, it would be using the buffer.

Consecutive answered 5/6, 2017 at 18:34 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.