Esto puede sonar frívolo, pero PrintStream
imprime a OutputStream
, y PrintWriter
imprime a Writer
. Ok, dudo que obtenga ningún punto por decir lo obvio. Pero hay más.
Entonces, ¿cuál es la diferencia entre un OutputStream
y un Writer
? Ambas son transmisiones, con la diferencia principal de que OutputStream
es una secuencia de bytes mientras que un Escritor es una secuencia de caracteres.
Si un OutputStream
trata con bytes, ¿qué hay de PrintStream.print(String)
? Convierte los caracteres a bytes utilizando la codificación de plataforma predeterminada. Usar la codificación predeterminada generalmente es malo, ya que puede provocar errores al pasar de una plataforma a otra, especialmente si está generando el archivo en una plataforma y consumiéndolo en otra.
Con un Writer
, normalmente se especifica la codificación que se va a utilizar, evitando cualquier dependencia de la plataforma.
¿Por qué molestarse en tener un PrintStream
en el JDK, ya que la intención principal es escribir caracteres, y no bytes? PrintStream
es anterior a JDK 1.1 cuando se introdujeron las secuencias de caracteres de Reader/Writer. Imagino que Sun habría dejado de usar PrintStream
solo por el hecho de que es muy utilizado. (Después de todo, usted no desea que cada llamada a System.out
para generar una advertencia API en desuso! Además, cambiar el tipo PrintStream
-PrintWriter
sobre los flujos de salida estándar habría roto las aplicaciones existentes.)
+1 Buena pregunta, también mezclo estas dos clases, y el doc API tampoco ayuda mucho. – helpermethod
Otra diferencia es cómo funciona el autoflush. Para un escritor, la presencia de un carácter \ n en la salida activa flush(). Pero en una secuencia de bytes (PrintStream) solo hay bytes. autoflush funciona como se describe en Javadoc, basado en: "la propia noción de separador de línea de la plataforma en lugar del carácter de nueva línea". – mins