🇺🇦 Слава Україні! Consulta como ayudar a Ucrania y pide a tu gobierno que se movilice supportukrainenow.org.

Java IO

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.

Fecha de emisión:

Duración: 4:52

Ver en YouTube

Notas del episodio

Y termino este taller hablando de una clase que me parece bastante peculiar, pero que puede ser útil cuando queráis masivamente escribir cosas, por ejemplo en archivos, que es la clase PrintWriter. Esta es una clase de tipo Impresora, pero también es de tipo Writer. Un PrintWriter es una clase que nos hace la vida más fácil cuando tenemos que imprimir grandes cantidades de información. Imprimir en el sentido de que vamos a hacer muchas llamadas pasándole muchos strings especiales y vamos a esperar que nos escriba de la forma más conveniente.

PrintWriter, de hecho, tiene un constructor bastante peculiar, porque se trata de un constructor que acepta un archivo, si queremos que escriba en un archivo; o una cadena de caracteres si queremos decirle el nombre del archivo en el que queremos escribir. Pero también nos va a permitir proporcionar un OutputStream o un Writer, si lo que queremos es que envuelva a un Writer o incluso a un OutputStream, y lo que hará incluso es envolverlo en un OutputStreamWriter automáticamente para que nosotros no tengamos que hacerlo. Cuánta conveniencia: podemos empujárselo a un socket de red o a un FileOutputStream, o a un FileWriter, o directamente decirle: "mira, quiero que me escribas el archivo impresora.txt".

De cualquiera de las formas que hagamos esto, lo que PrintWriter nos va a permitir es tener métodos bastante interesantes, ya no sólo los típicos como write(), que se da por hecho que va a estar ahí, o como flush() o todos esos, sino que PrintWriter agrega métodos extra como print, printf o println. println, posiblemente os suene de System.out, y es porque de hecho System.out, si soy capaz de escribirlo bien, es un PrintStream. Esto no es un PrintWriter pero se le parece, también es una impresora. Este de hecho es el que usarías cuando quieres enviar una línea completa a pantalla.

Evidentemente, si nos instanciamos nuestras propias impresoras, tendremos la posibilidad de hacer nuestros propios prints, escribiendo lo que queramos. Por ejemplo, 25, "hola mundo". Pero también, llamadas a print que nos van a permitir escribir sin insertar saltos de línea, que es la principal diferencia entre print y println. Incluso printf, que es una función que se comporta como un printf en otro lenguaje de programación. Es peculiar pero nos permite hacer cosas como "Hola %s", un placeholder para decir que me pongas un String. ¿Qué String? Mundo, mismamente. Tengo un vídeo sobre cómo funciona printf en el lenguaje de programación C que os puede ser bastante útil si queréis aprender a usar printf(), pero esto es una anécdota proque esto tiene bastante utilidad cuando podemos hacer las cosas con print o println, o bien utilizar un formateador un poco más especial.

Sea como sea, si no le pongo flush(), posiblemente no se escriba.

Sea como sea, aquí aparece lo que yo he escrito línea a línea, porque estoy utilizando print y println. En ese sentido, PrintStream es parecida. Es una clase cuya diferencia está en que se va a comportar como un OutputStream, no como un Writer, pero que nos va a permitir hacer funciones parecidas. Podemos escribir en archivos o podemos envolver otro stream, como un stream TCP, una base de datos o lo que sea. El funcionamiento es exactamente igual así que no lo voy a testear mucho.

Tenemos algo peculiar, métodos append, que es algo que normalmente en un OutputStream no va a estar, pero bueno, es algo que nos proporciona el propio PrintStream. Tenemos, por supuesto, print, printf, println, tenemos format, flush... Por ejemplo, esto es lo que hacen System.out y System.err, que son PrintStreams, lo que nos permite escribir en esos streams de salida estandar, como si fuese un writer usando prints.

Como digo, estas son clases que normalmente no usaremos, pero que a veces, si estamos haciendo conexiones de red y estamos haciendo un servidor, puede facilitar para de una forma más fácil escribir una línea en vez de estar haciendo 20 llamadas a write o a append.

Eso sería todo en cuanto a este pequeño taller sobre entrada y salida en Java. Todo el código que he escrito a lo largo del taller lo he estado recopilando y lo tenéis subido a alguna parte... aun no sé donde pero estará en alguna parte que podréis ver en la descripción de este vídeo.

Espero que os haya gustado y si es así y os lo habéis visto completo, qué campeones, qué menos que agradecerlo con un Me gusta, que es gratis y no os cuesta nada. Si os ha gustado mucho, suscribiros y darle al me gusta, comentad y esas cosas que así podrán señalizarme que os gusta y que queréis más como esto y esas cositas. Gracias por vuestra atención, nos vemos en próximos vídeos, un saludo y hasta luego.