PrintStream y PrintWriter

Cerramos con un par de clases interesantes, porque son impresoras. Permiten empujar, tanto a un stream de byte como a un stream de char, cadenas de caracteres de múltiples tipos. Puede que ya las hayas utilizado, porque System.out y System.err son PrintStreams.

Cuando trabajamos con grandes cantidades de texto que necesitamos escribir en archivos o flujos, la clase PrintWriter en Java se convierte en una herramienta muy útil. PrintWriter es un tipo especial de writer que simplifica enormemente la tarea de imprimir texto, permitiéndonos hacer múltiples llamadas con cadenas de caracteres y asegurando que se escriban de la forma más conveniente.

Una de las características más interesantes de PrintWriter es su constructor, que acepta diferentes tipos de argumentos. Podemos indicarle directamente un archivo o el nombre de un archivo para que escriba en él. También podemos proporcionarle un OutputStream o un Writer, y PrintWriter se encargará de envolverlo automáticamente en un OutputStreamWriter si es necesario. Esto nos da mucha flexibilidad, ya que podemos usarlo para escribir en un archivo, en un socket de red, o en cualquier otro flujo de salida, sin preocuparnos por los detalles de la conversión.

Además de los métodos básicos que esperamos de un writer, como write, flush o close, PrintWriter añade métodos muy prácticos como print, println y printf. El método println nos resulta familiar porque es similar al que usamos con System.out, que en realidad es un PrintStream, una clase parecida a PrintWriter pero que extiende OutputStream en lugar de Writer. Con print podemos escribir texto sin añadir un salto de línea, mientras que println añade automáticamente ese salto. Por otro lado, printf nos permite formatear cadenas con placeholders, muy parecido a cómo funciona en otros lenguajes como C.

Por ejemplo, podemos escribir algo así:

PrintWriter pw = new PrintWriter("archivo.txt");
pw.print("Hola ");
pw.println("mundo");
pw.printf("Número: %d", 25);
pw.flush();
pw.close();

Es importante recordar que, para asegurarnos de que todo el texto se escriba realmente en el destino, debemos llamar a flush antes de cerrar el PrintWriter.

Por otro lado, PrintStream es una clase similar que trabaja con OutputStreams y también ofrece métodos como print, println y printf. La diferencia principal es que PrintStream se basa en bytes, mientras que PrintWriter trabaja con caracteres, lo que puede ser relevante dependiendo del tipo de datos que manejemos. PrintStream también incluye métodos como append y format, y es la clase que utiliza System.out para imprimir en la consola.

Estas clases no son las que más usaremos en el día a día, pero resultan muy prácticas cuando estamos trabajando con conexiones de red o implementando servidores, ya que facilitan la escritura de líneas completas sin tener que hacer múltiples llamadas a métodos más básicos como write o append.

En definitiva, PrintWriter y PrintStream nos ofrecen una forma cómoda y eficiente de manejar la salida de texto en Java, ya sea en archivos, conexiones de red o cualquier otro flujo de salida, simplificando mucho el trabajo con grandes volúmenes de texto.

Lista de reproducción
  1. 1
    Introducción al taller
    2 minutos
  2. 2
    Qué es la entrada y salida
    4 minutos
  3. 3
    Streams de entrada y salida en Java
    7 minutos
  4. 4
    FileOutputStream
    9 minutos
  5. 5
    FileInputStream
    13 minutos
  6. 6
    try-with-resources
    2 minutos
  7. 7
    ObjectOutputStream y OutputInputStream
    6 minutos
  8. 8
    Object streams con Strings y Objects
    6 minutos
  9. 9
    Serializando clases
    7 minutos
  10. 10
    Los peligros de Serializable
    4 minutos
  11. 11
    BufferedOutputStream
    6 minutos
  12. 12
    Envolviendo varios OutputStreams
    2 minutos
  13. 13
    BufferedInputStream y rebobinado de streams
    9 minutos
  14. 14
    Readers y Writers en Java
    3 minutos
  15. 15
    Writer y FileWriter
    4 minutos
  16. 16
    Reader, FileReader y BufferedReader
    4 minutos
  17. 17
    InputStreamReader y OutputStreamWriter
    6 minutos
  18. 18
    PrintStream y PrintWriter
    5 minutos