Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PrintStream vs PrintWriter

Tags:

java

I have searched the site and have found some answers, but i'm having trouble understanding the difference between these two classes. Can someone explain the differences between these two classes?

like image 731
i'mhungry Avatar asked Jul 07 '12 05:07

i'mhungry


People also ask

Is PrintWriter faster than PrintStream?

PrintStreams can allow more flexibility with encoding. I'm guessing that some system encodings are used, but I'm not sure. PrintWriter is also about twice as fast for printing text.

What is PrintStream used for?

PrintStream ) enables you to write formatted data to an underlying OutputStream . The PrintStream class can format primitive types like int , long etc. formatted as text, rather than as their byte values.

Is PrintWriter faster?

println is preferred when we have to print a lot of items as PrintWriter is faster than the other to print data to the console.

Is PrintWriter and output stream?

OutputStreams are meant for binary data. Writers (including PrintWriter ) are meant for text data. You may not see the difference in your specific situation as you're calling PrintWriter.


2 Answers

PrintStream was the original bridge to deal with encoding characters and other datatypes. If you look at the javadoc for java.io.OutputStream you'll see methods only for writing two distinct data types: byte and int.

In early versions of the JDK (1.0.x), when you wanted to write characters, you could do one of two things, write bytes to an output stream (which are assumed to be in the system default character set):

outputStream.write("foobar".getBytes()); 

or wrap another outputStream in a PrintStream:

PrintStream printStream = new PrintStream(outputStream); printStream.write("foobar"); 

See the difference? PrintStream is handling the character conversion to bytes, as well as encoding (the constructor call above uses the system default encoding, but you could pass it as a parameter). It also provides convenience methods for writing double, boolean, etc....

In fact System.out and System.err are defined as PrintStream instances.

Along comes JDK 1.1, and they realize they need a better way to deal with pure character data, since PrintStream still has the byte based methods for writing. So they introduced the Writer abstract class to deal strictly with char, String and int data.

PrintWriter adds methods for other types like double, boolean, etc...

Nowadays PrintWriter also has format() / printf() methods for format printing, etc...

As a general rule, if you're writing character data, use Writer instances. If you're writing binary (or mixed) data use OutputStream instances.

like image 148
Matt Avatar answered Sep 19 '22 12:09

Matt


From the Javadoc for PrintWriter:

Prints formatted representations of objects to a text-output stream. This class implements all of the print methods found in PrintStream. It does not contain methods for writing raw bytes, for which a program should use unencoded byte streams.

Think of it this way: a PrintStream sits on top of some OutputStream. Since output streams deal with bytes rather than characters, the PrintStream must take responsibility for encoding characters into bytes. The OutputStream 'merely' writes the bytes out to a file/console/socket whatever.

A PrintWriter, on the other hand, sits on top of a Writer. Since the Writer is responsible for encoding characters into bytes, the PrintWriter does not do encoding. I just knows about newlines etc. (Yes, PrintWriters do have constructors that take Files and OutputStreams, but those are simply conveniences. For example, PrintWriter(OutputStream).

Creates a new PrintWriter, without automatic line flushing, from an existing OutputStream. This convenience constructor creates the necessary intermediate OutputStreamWriter, which will convert characters into bytes using the default character encoding.

BTW, In case you are thinking that the PrintWriter really doesn't have much utility, remember that both PrintWriter and PrintStream absorb IOExceptions from printing logic.

like image 31
Dilum Ranatunga Avatar answered Sep 19 '22 12:09

Dilum Ranatunga