2010-05-12 21 views
112

¿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.Java: diferencia entre PrintStream y PrintWriter

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

+1

+1 Buena pregunta, también mezclo estas dos clases, y el doc API tampoco ayuda mucho. – helpermethod

+0

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

Respuesta

117

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.)

+2

Esto es lo que pensé también, pero no es cierto. Incluso PrintStream mantiene un Writer bajo el capó: si le pasa un OutputStream, lo envuelve. –

+2

@Jon - internamente, hay un Writer, pero se escribe en un OutputStream, por lo que el efecto neto es que PrintStream escribe en un OutputStream - ocurre la conversión de char a byte y usa la codificación de plataforma predeterminada. No existe tal requisito para la conversión de caracteres en un PrintWriter, puede quedarse con los caracteres hasta el final. – mdma

+0

"El juego de caracteres predeterminado se determina durante el inicio de la máquina virtual y generalmente depende de la configuración regional y el juego de caracteres del sistema operativo subyacente .", También cambia el juego de caracteres predeterminado en algunas plataformas. – Pindatjuh

3

Escritores como son para PrintStream 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.

+1

Excepto PrintStream, porque toma una codificación para que pueda manejar un poco más que un OutputStream estándar. –

+0

Suena extraño que System.out, cuyo único objetivo es imprimir cadenas, es en realidad un PrintStream. – mins

+0

"Los escritores manejan las cosas del conjunto de caracteres por ti", solo los escritores que se ocupan de convertir caracteres en bytes. No todos los escritores lo hacen. – Aivar

2

Puede escribir bytes sin procesar en una secuencia 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 formato que diría).

+0

Con PrintStream, también se puede especificar la codificación – Aivar

58

Con el PrintStream está atascado en la codificación predeterminada de la plataforma.

PrintStream stream = new PrintStream(output); 

Con la PrintWriter sin embargo, puede pasar una OutputStreamWriter con una codificación específica.

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

La ventaja es, así, que se puede controlar la codificación de caracteres de los caracteres debe ser escrito en tales que no van finalmente terminar como mojibake.

+38

+1 para enseñarme una nueva palabra, mojibake :) – Jonik

+7

Desde 1.4, hay un nuevo constructor para PrintStream que toma la codificación 'PrintStream (OutputStream out, boolean autoFlush, String encoding)' – artbristol

+0

gracias! - Estaba buscando precisamente una forma de imprimir en una matriz de bytes con una codificación específica. –

17

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.

-1

Printwriter es una mejora de printstream.

I.E. imprime la raya para un propósito específico.

Cuestiones relacionadas