This might sound flippant, but PrintStream
prints to an OutputStream
, and PrintWriter
prints to a Writer
. Ok, I doubt I'll get any points for stating the obvious. But there's more.
So, what is the difference between an OutputStream
and a Writer
?
Both are streams, with the primary difference being a OutputStream
is a stream of bytes while a Writer
is a stream of characters.
If an OutputStream
deals with bytes, what about PrintStream.print(String)
? It converts chars to bytes using the default platform encoding. Using the default encoding is generally a bad thing since it can lead to bugs when moving from one platform to another, especially if you are generating the file on one platform and consuming it on another.
With a Writer
, you typically specify the encoding to use, avoiding any platform dependencies.
Why bother having a PrintStream
in the JDK, since the primary intent is to write characters, and not bytes? PrintStream
predates JDK 1.1 when Reader/Writer character streams were introduced. I imagine Sun would have deprecated PrintStream
if only for the fact it is so widely used. (After all, you wouldn't want each call to System.out
to generate a deprecated API warning! Also, changing the type from PrintStream
to PrintWriter
on the standard output streams would have broken existing applications.)