Esto puede sonar frívolo, pero se PrintStreamimprime en una OutputStream, y se PrintWriterimprime en una Writer. Ok, dudo que obtenga algún punto por decir lo obvio. Pero hay más.
Entonces, ¿cuál es la diferencia entre an OutputStreamy a Writer? Ambos son flujos, con la diferencia principal de que OutputStreames un flujo de bytes mientras que a Writeres un flujo de caracteres.
Si se OutputStreamtrata de bytes, ¿qué pasa PrintStream.print(String)? Convierte caracteres en bytes utilizando la codificación de plataforma predeterminada. El uso de la codificación predeterminada generalmente es algo malo, ya que puede generar errores al moverse de una plataforma a otra, especialmente si está generando el archivo en una plataforma y consumiéndolo en otra.
Con un Writer, normalmente especificas la codificación a usar, evitando las dependencias de la plataforma.
¿Por qué molestarse en tener un PrintStreamJDK, ya que la intención principal es escribir caracteres y no bytes? PrintStreames anterior a JDK 1.1 cuando se introdujeron secuencias de caracteres de Reader / Writer. Me imagino que Sun habría quedado en desuso PrintStreamsi solo fuera por el hecho de que es tan ampliamente utilizado. (¡Después de todo, no querrá que cada llamada System.outgenere una advertencia de API obsoleta! Además, cambiar el tipo de PrintStreama PrintWriterlas secuencias de salida estándar habría roto las aplicaciones existentes).