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

Java IO

Readers y Writers en Java

• Duración: 3:23

Cuando se trabaje con caracteres, un InputStream y un OutputStream se va a quedar corto debido a que todo es de tipo byte, pero en Java los caracteres son de tipo char. Para eso existe Reader y Writer, que es una interfaz muy similar a la de InputStream y OutputStream, en la que se trabaja con chars en vez de con bytes.

Hasta aquí en cuanto a InputStream y OutputStream. Ahora lo que voy a hacer es hablar de una serie de clases un poco parecidas pero diferentes: Reader y Writer. Estas clases existen, fundamentalmente, para poder hacer una operación similar a la que hacen InputStream y OutputStream, pero trabajando con caracteres. ¿Por qué necesitaríamos clases especiales para trabajar con caracteres? Porque si habéis estado prestando atención a vuestro curso de Java que estáis siguiendo, os habréis dado cuenta que hay dos tipos en Java: el tipo byte y el tipo char. Las cadenas de caracteres y los caracteres en Java son de tipo char, así que no hay ninguna equivalencia. De hecho, internamente en el caso de Java, las cadenas de caracteres en Java usan codificación UTF-16, lo que tampoco es lo habitual, porque hoy día lo normal es UTF-8. Entonces, ni siquiera cabe, porque UTF-16 quiere decir que cada carácter puede ocupar 2 bytes, lo cual es más grande que 1 byte. Al final, es necesario que si vamos a trabajar con datos de texto, se use su propio conjunto de clases.

En realidad, Reader y Writer son bastante parecidas a sus hermanas InputStream y OutputStream. Son abstractas, pero vamos a tener una jerarquía de clases para poder fabricarnos nuestros propios Readers y nuestros propios Writers, los cuales están contados en el Javadoc. Cosas como FileReader y FileWriter, nos van a permitir leer de un archivo o escribir en un archivo en modo texto, para guardar cadenas de caracteres sobre el mismo. También nuestras clases favoritas como BufferedReader o BufferedWriter, para poder hacer una lectura o una escritura bufferizada que sea un poco más eficiente, y también otras clases: una que contaré como anécdota al final de este tutorial, llamada PrintWriter, que sirve para escribir como si fuese una impresión. Esta clase es muy posible que aunque no lo sepáis, ya la hayáis utilizado.

Sin embargo, hay que tener en cuenta que en muchas partes de la biblioteca de Java se va a asumir que vas a estar trabajando con InputStreams y con OutputStreams, de modo que aparte de todas estas clases que tengo acá, Reader, Writer y similares, vamos a tener una serie de clases extra que van a permitir hacer la traducción entre un Reader y un InputStream, y entre un Writer y un OutputStream. De este modo, también va a ser momento de presentar clases como InputStreamReader, que sirve para trabajar con un Reader, que acepte como parámetro un InputStream, para convertir un InputStream binario en un reader de texto, y así poder leer caracteres de texto a través de un flujo que de otro modo sería binario. Similarmente, para poder hacer la traducción entre un OutputStream y un Writer vamos a tener una clase intermedia que se va a llamar OutputStreamWriter, que es la que nos va a permitir enviar los datos de un Writer hacia un OutputStream para, por ejemplo, si tenemos que trabajar con un socket TCP que solo tiene InputStream y OutputStream, por lo menos con esta clase vamos a poder escribir cadenas de caracteres usando un Writer regular.

Desplegar transcripción del episodio

[Música]

Hasta aquí en cuanto a InputStream y OutputStream. Ahora lo que voy a hacer es hablar de una serie de clases un poco parecidas pero diferentes: Reader y Writer. Estas clases existen, fundamentalmente, para poder hacer una operación similar a la que hacen InputStream y OutputStream, pero trabajando con caracteres. ¿Por qué necesitaríamos clases especiales para trabajar con caracteres? Porque si habéis estado prestando atención a vuestro curso de Java que estáis siguiendo, os habréis dado cuenta que hay dos tipos en Java: el tipo byte y el tipo char. Las cadenas de caracteres y los caracteres en Java son de tipo char, así que no hay ninguna equivalencia. De hecho, internamente en el caso de Java, las cadenas de caracteres en Java usan codificación UTF-16, lo que tampoco es lo habitual, porque hoy día lo normal es UTF-8. Entonces, ni siquiera cabe, porque UTF-16 quiere decir que cada carácter puede ocupar 2 bytes, lo cual es más grande que 1 byte. Al final, es necesario que si vamos a trabajar con datos de texto, se use su propio conjunto de clases.

En realidad, Reader y Writer son bastante parecidas a sus hermanas InputStream y OutputStream. Son abstractas, pero vamos a tener una jerarquía de clases para poder fabricarnos nuestros propios Readers y nuestros propios Writers, los cuales están contados en el Javadoc. Cosas como FileReader y FileWriter, nos van a permitir leer de un archivo o escribir en un archivo en modo texto, para guardar cadenas de caracteres sobre el mismo. También nuestras clases favoritas como BufferedReader o BufferedWriter, para poder hacer una lectura o una escritura bufferizada que sea un poco más eficiente, y también otras clases: una que contaré como anécdota al final de este tutorial, llamada PrintWriter, que sirve para escribir como si fuese una impresión. Esta clase es muy posible que aunque no lo sepáis, ya la hayáis utilizado.

Sin embargo, hay que tener en cuenta que en muchas partes de la biblioteca de Java se va a asumir que vas a estar trabajando con InputStreams y con OutputStreams, de modo que aparte de todas estas clases que tengo acá, Reader, Writer y similares, vamos a tener una serie de clases extra que van a permitir hacer la traducción entre un Reader y un InputStream, y entre un Writer y un OutputStream. De este modo, también va a ser momento de presentar clases como InputStreamReader, que sirve para trabajar con un Reader, que acepte como parámetro un InputStream, para convertir un InputStream binario en un reader de texto, y así poder leer caracteres de texto a través de un flujo que de otro modo sería binario. Similarmente, para poder hacer la traducción entre un OutputStream y un Writer vamos a tener una clase intermedia que se va a llamar OutputStreamWriter, que es la que nos va a permitir enviar los datos de un Writer hacia un OutputStream para, por ejemplo, si tenemos que trabajar con un socket TCP que solo tiene InputStream y OutputStream, por lo menos con esta clase vamos a poder escribir cadenas de caracteres usando un Writer regular.