🇺🇦 Слава Україні! Consulta cómo puedes ayudar a Ucrania desde España u otros países en supportukrainenow.org.

Java IO

Writer y FileWriter

• Duración: 4:01

Writer es la clase que se usa para hacer escrituras hacia fuera utilizando caracteres. Lo más interesante es ver sus usos. Por ejemplo, con FileWriter podemos escribir caracteres y cadenas de caracteres en archivos de texto que se puedan leer por personas.

Vamos a ver en primer lugar cómo podemos utilizar un Writer. Para ello, voy a usar uno de los Writers más simples que nos podemos encontrar, que es FileWriter. El cual, como podéis imaginar por su prefijo, sirve para escribir en archivos. La idea de FileWriter es poder usar una clase de forma parecida a cómo se hacía con un FileOutputStream, diciéndole qué archivo queremos que se use para escribir. Sin embargo, tiene bastantes más parámetros y por ello existen más forma de invocar al constructor. Por ejemplo, con charset le podemos indicar la codificación de caracteres con la que queremos que se escriba. Cosa que, salvo que tengáis alguna necesidad concreta, en la mayoría de casos no será necesario. Seguid utilizando UTF-8 como de costumbre y ya está.

En este caso, vamos a escribir sobre un archivo, que podemos llamar hola.txt, y aquí sí lo voy a llamar .txt para que lo podamos abrir. Este archivo sí va a ser de tipo texto, así que en principio no deberíamos tener problemas para poder interpretarlo. Voy a usar adrede la interfaz de nombre Writer para poder mostraros los métodos comunes que van a estar en todos los writers. Algunos requieren usar la versión alternativa, que es usar directamente su clase. Voy a meterle un catch para que deje de quejarse.

Vamos a ver los distintos métodos que nos proporciona un Writer, que son unos cuantos. En primer lugar tenemos write(), que puede que conozcáis porque es igual que el que tenía un OutputStream. Sin embargo, aquí hay una sutil diferencia: write() nos va a permitir proporcionar, ya no solo un int, que representa un caracter, en codificación UTF-16, por si queremos guardar una letra sin más, o bien un array de caracteres, por si queremos escribir de una forma mucho más completa. Pero también tenemos una versión que nos deja escribir tal cual un string. Cuando queramos escribir un string, como por ejemplo, hola mundo, nosotros podemos utilizar la función write de Writer, y guardar tal cual una cadena de caracteres siempre que lleve el delimitador de fin de línea. Esto lo podemos hacer varias veces: cómo estás, y sucesivas. Siempre que nos apetezca.

También tenemos una serie de funciones llamadas append(), cuyo funcionamiento es igual al de write(). La única diferencia es que en vez de aceptar String, aceptan CharSequence. La diferencia entre un String y un CharSequence, es que un String es un CharSequence, pero puede haber cosas que sean CharSequence y no String. Esta es una interfaz un poco ámplia y un poco abstracta que representa las secuencias de caracteres, sean Strings u otra cosa.

No hay mucho que decir más allá de que, como cuenta la documentación, hacer un append() de un caracteres es lo mismo que hacer un write(), pero es más claro a veces hacer un append() de un char, que hacer un write() de un int, entonces a lo mejor según las circunstancias nos puede interesar hacer un append de la letra H, para guardar la H precisamente. Por supuesto, como los Strings son CharSequence, también podemos poner un String y lo podemos guardar con append(), pero hay clases que sin ser String van a ser CharSequence.

Luego, más operaciones habituales, como close(), que permitirá cerrar el Writer, igual que con un stream, así como flush(), que empujará cualquier cosa que pueda haber quedado ahí temporalmente para asegurarse de que esté enviada al buffer de forma definitiva. Como estoy usando un try-with-resources, no va a hacer falta que ponga close(), porque se supone que me lo va a cerrar cuando esto termine, así que simplemente voy a ejecutar este programa. Esto hará que aparezca un archivo llamado hola.txt que contendrá mis cadenas de caracteres tal como fueron escritas: hola mundo, como estás, la letra H y la cadena hola, y se debería ver bien tanto en el editor de NetBeans como en el del propio sistema operativo, en el que, por suerte, hoy día no necesitas ponerle \n porque ya reconoce que no estás usando el separador de líneas correcto para Windows.

Desplegar transcripción del episodio

[Música]

Vamos a ver en primer lugar cómo podemos utilizar un Writer. Para ello, voy a usar uno de los Writers más simples que nos podemos encontrar, que es FileWriter. El cual, como podéis imaginar por su prefijo, sirve para escribir en archivos. La idea de FileWriter es poder usar una clase de forma parecida a cómo se hacía con un FileOutputStream, diciéndole qué archivo queremos que se use para escribir. Sin embargo, tiene bastantes más parámetros y por ello existen más forma de invocar al constructor. Por ejemplo, con charset le podemos indicar la codificación de caracteres con la que queremos que se escriba. Cosa que, salvo que tengáis alguna necesidad concreta, en la mayoría de casos no será necesario. Seguid utilizando UTF-8 como de costumbre y ya está.

En este caso, vamos a escribir sobre un archivo, que podemos llamar hola.txt, y aquí sí lo voy a llamar .txt para que lo podamos abrir. Este archivo sí va a ser de tipo texto, así que en principio no deberíamos tener problemas para poder interpretarlo. Voy a usar adrede la interfaz de nombre Writer para poder mostraros los métodos comunes que van a estar en todos los writers. Algunos requieren usar la versión alternativa, que es usar directamente su clase. Voy a meterle un catch para que deje de quejarse.

Vamos a ver los distintos métodos que nos proporciona un Writer, que son unos cuantos. En primer lugar tenemos write(), que puede que conozcáis porque es igual que el que tenía un OutputStream. Sin embargo, aquí hay una sutil diferencia: write() nos va a permitir proporcionar, ya no solo un int, que representa un caracter, en codificación UTF-16, por si queremos guardar una letra sin más, o bien un array de caracteres, por si queremos escribir de una forma mucho más completa. Pero también tenemos una versión que nos deja escribir tal cual un string. Cuando queramos escribir un string, como por ejemplo, hola mundo, nosotros podemos utilizar la función write de Writer, y guardar tal cual una cadena de caracteres siempre que lleve el delimitador de fin de línea. Esto lo podemos hacer varias veces: cómo estás, y sucesivas. Siempre que nos apetezca.

También tenemos una serie de funciones llamadas append(), cuyo funcionamiento es igual al de write(). La única diferencia es que en vez de aceptar String, aceptan CharSequence. La diferencia entre un String y un CharSequence, es que un String es un CharSequence, pero puede haber cosas que sean CharSequence y no String. Esta es una interfaz un poco ámplia y un poco abstracta que representa las secuencias de caracteres, sean Strings u otra cosa.

No hay mucho que decir más allá de que, como cuenta la documentación, hacer un append() de un caracteres es lo mismo que hacer un write(), pero es más claro a veces hacer un append() de un char, que hacer un write() de un int, entonces a lo mejor según las circunstancias nos puede interesar hacer un append de la letra H, para guardar la H precisamente. Por supuesto, como los Strings son CharSequence, también podemos poner un String y lo podemos guardar con append(), pero hay clases que sin ser String van a ser CharSequence.

Luego, más operaciones habituales, como close(), que permitirá cerrar el Writer, igual que con un stream, así como flush(), que empujará cualquier cosa que pueda haber quedado ahí temporalmente para asegurarse de que esté enviada al buffer de forma definitiva. Como estoy usando un try-with-resources, no va a hacer falta que ponga close(), porque se supone que me lo va a cerrar cuando esto termine, así que simplemente voy a ejecutar este programa. Esto hará que aparezca un archivo llamado hola.txt que contendrá mis cadenas de caracteres tal como fueron escritas: hola mundo, como estás, la letra H y la cadena hola, y se debería ver bien tanto en el editor de NetBeans como en el del propio sistema operativo, en el que, por suerte, hoy día no necesitas ponerle \n porque ya reconoce que no estás usando el separador de líneas correcto para Windows.