funcion - Java: diferencia entre PrintStream y PrintWriter
java printwriter que es (6)
¿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.
Con PrintStream
está atascado en la codificación predeterminada de la plataforma.
PrintStream stream = new PrintStream(output);
Sin embargo, con PrintWriter
puede pasar un OutputStreamWriter
con una codificación específica.
PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, "UTF-8"));
La ventaja es, bueno, que puedes controlar la codificación de los personajes, los caracteres deben escribirse de forma tal que finalmente no terminen como mojibake .
Desde JDK 1.4 es posible especificar la codificación 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.
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 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 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).
Printwriter es una mejora de la gama de impresiones.
IE printstream para un propósito específico.
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 codificación en una secuencia para que pueda interpretar los bytes sin procesar que diría).