Java: diferencia entre PrintStream y PrintWriter

¿Cuál es la diferencia entre PrintStream y PrintWriter ? Tienen muchos métodos en común debido a que a menudo mezclo estas dos clases. Además, creo que podemos usarlos exactamente para las mismas cosas. Pero tiene que haber una diferencia, de lo contrario, habría habido una sola clase.

He buscado en los archivos, pero no he podido encontrar esta pregunta.

    Esto puede sonar impreciso, pero PrintStream imprime en un OutputStream y PrintWriter imprime en un Writer . Ok, dudo que obtenga ningún punto por afirmar 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 un OutputStream es una secuencia de bytes mientras que un Writer es una secuencia de caracteres.

    Si un OutputStream trata con bytes, ¿qué pasa con PrintStream.print(String) ? Convierte los caracteres a bytes utilizando la encoding de plataforma predeterminada. Usar la encoding 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 encoding que se va a usar, 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 Reader / Writer. Imagino que Sun habría PrintStream utilizar PrintStream solo por el hecho de que es muy utilizado. (¡Después de todo, no querría que cada llamada a System.out generara una advertencia de api en desuso! Además, cambiar el tipo de PrintStream a PrintWriter en las secuencias de salida estándar habría roto las aplicaciones existentes).

    Con PrintStream está atascado en la encoding predeterminada de la plataforma.

     PrintStream stream = new PrintStream(output); 

    Sin embargo, con PrintWriter puede pasar un OutputStreamWriter con una encoding específica.

     PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, "UTF-8")); 

    La ventaja es, bueno, que puedes controlar la encoding de los personajes, los caracteres deben escribirse de forma tal que finalmente no terminen como mojibake .

    Desde JDK 1.4 es posible especificar la encoding de caracteres para un PrintStream. Por lo tanto, las diferencias entre PrintStream y PrintWriter solo se refieren al comportamiento de autoflujo y que PrintStream no puede ajustar un Writer.

    Escritores como PrintWriter son para salida de texto, las transmisiones son para salida binaria. Los escritores manejan cosas de conjunto de caracteres para ti. Las transmisiones no funcionan porque se supone que no desea ese tipo de conversión, lo que podría arruinar sus datos binarios, y estaría utilizando un escritor si lo hiciera.

    Puede escribir bytes sin procesar en un flujo y no en un escritor. El PrintWriter javadoc enumera las otras diferencias (lo más importante, ser capaz de establecer una encoding en una secuencia para que pueda interpretar los bytes sin procesar que diría).

    Printwriter es una mejora de la gama de impresiones.

    IE printstream para un propósito específico.