Java: diferencia entre PrintStream y PrintWriter

5 minutos de lectura

Java diferencia entre PrintStream y PrintWriter
Martijn Courteaux

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

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

  • +1 Buena pregunta, también mezclo estas dos clases, y el documento API tampoco ayuda mucho.

    – método auxiliar

    24 mayo 2010 en 13:02

  • Otra diferencia es cómo funciona la descarga automática. Para un escritor, la presencia de un carácter n en la salida activa flush(). Pero en un flujo de bytes (PrintStream) solo hay bytes. autoflush luego funciona como se describe en Javadoc, basado en: “la noción propia de la plataforma de separador de línea en lugar del carácter de nueva línea”.

    – minutos

    24 mayo 2014 en 23:08

1641675803 408 Java diferencia entre PrintStream y PrintWriter
mdma

Esto puede sonar frívolo, pero PrintStream imprime a un OutputStream, y PrintWriter imprime a un Writer. Ok, dudo que obtenga algún punto por decir lo obvio. Pero hay más

Entonces, ¿cuál es la diferencia entre un OutputStream y un Writer? Ambos son flujos, con la principal diferencia de ser un OutputStream es un flujo de bytes mientras que un Writer es una corriente de caracteres.

Si una OutputStream trata con bytes, ¿qué pasa con PrintStream.print(String)? Convierte caracteres en bytes utilizando la codificación de plataforma predeterminada. Usar la codificación predeterminada generalmente es algo malo, ya que puede generar 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 especifica la codificación 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 los flujos de caracteres de Lector/Escritor. Me imagino que Sun habría desaprobado PrintStream aunque sólo sea por el hecho de que es tan ampliamente utilizado. (Después de todo, no querrá que cada llamada System.out para generar una advertencia de API obsoleta! Además, cambiando el tipo de PrintStream a PrintWriter en los flujos de salida estándar habría roto las aplicaciones existentes).

  • Esto es lo que yo también pensé, pero no es cierto. Incluso PrintStream mantiene un escritor debajo del capó: si le pasa un OutputStream, lo envuelve.

    – Jon Skeet

    12 mayo, 2010 a las 19:21

  • @Jon: internamente, hay un Escritor, pero escribe en un OutputStream, por lo que el efecto neto es que un PrintStream escribe en un OutputStream: se produce la conversión de caracteres a bytes y utiliza la codificación de plataforma predeterminada. No existe tal requisito para la conversión char->byte en un PrintWriter, puede quedarse con los caracteres todo el tiempo.

    – mdma

    12 mayo, 2010 a las 19:29

  • Desde Java 1.5, PrintStream no se ha limitado a usar la codificación predeterminada de la plataforma; hay constructores que aceptan un nombre de juego de caracteres. Así, las distinciones entre PrintStream y PrintWriter es eso un PrintWriter no puede escribir bytes sin procesar y las dos clases envuelven diferentes tipos de destinos.

    –Ted Hopp

    09 may.


  • También podría valer la pena notar una diferencia significativa en su comportamiento, mientras que efectivamente comparten una interfaz PrintStream‘s print() Los métodos son funciones de conveniencia que llaman write(), como tal, activan el lavado automático si están habilitados. PrintWriter por otro lado, no se descargará automáticamente después de una llamada a print(). Hoy hice una demostración de Java para principiantes y esto sorprendió a algunos estudiantes que no estaban familiarizados con la necesidad de vaciar manualmente. De lo contrario tu respuesta es genial.

    – Robadob

    06 oct.

  • @ieXcept Tiene razón, tal vez debería haber aclarado que me refería al comportamiento predeterminado, ya que estaban usando un printwriter envuelto por alguna biblioteca.

    – Robadob

    05 may. 16 en 12:51

Desde JDK 1.4 es posible especificar la codificación de caracteres para un PrintStream. Por lo tanto, las diferencias entre PrintStream y PrintWriter son solo sobre el comportamiento de descarga automática y que un PrintStream no puede envolver un escritor.

Los escritores como PrintWriter son para salida de texto, las secuencias son para salida binaria. Los escritores manejan las cosas del juego de personajes por ti. Las secuencias no lo hacen porque se supone que no desea ese tipo de conversión, lo que estropearía sus datos binarios y usaría un escritor si lo hiciera.

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

    – Simón Groenewolt

    12 mayo, 2010 a las 19:25


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

    – minutos

    24 mayo 2014 en 22:53

  • “Los escritores manejan las cosas del conjunto de caracteres por usted”: solo los escritores se ocupan de convertir caracteres en bytes. No todos los escritores lo hacen.

    – Aivar

    07 abr.

Puede escribir bytes sin formato en un flujo y no en un escritor. El Escritor de impresión javadoc enumera las otras diferencias (lo más importante, poder establecer una codificación en una transmisión para que pueda interpretar los bytes sin procesar, diría yo).

desde núcleo java por Horstmann

Los veteranos de Java podrían preguntarse qué pasó con la clase PrintStream y System.out. En Java 1.0, la clase PrintStream simplemente truncaba todos los caracteres Unicode a caracteres ASCII eliminando el byte superior. (En ese momento, Unicode todavía era una codificación de 16 bits). Claramente, ese no era un enfoque limpio o portátil, y se solucionó con la introducción de lectores y escritores en Java 1.1. Por compatibilidad con el código existente, System.in, System.out y System.err siguen siendo flujos de entrada/salida, no lectores y escritores. Pero ahora la clase PrintStream convierte internamente los caracteres Unicode a la codificación de host predeterminada de la misma manera que lo hace PrintWriter. Los objetos de tipo PrintStream actúan exactamente como escritores de impresión cuando usa los métodos print e println, pero a diferencia de los escritores de impresión, le permiten generar bytes sin formato con las funciones write(int) y write(byte[]) métodos.

Java diferencia entre PrintStream y PrintWriter
Cuchara

Printwriter es una mejora de printstream.

IE printstream para un propósito específico.

.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad