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

Java IO

Reader, FileReader y BufferedReader

• Duración: 4:07

Del mismo modo, con Reader tenemos la posibilidad de leer del mundo exterior en forma de caracter o stream de texto. Por ejemplo, con FileReader se puede leer el texto de un archivo. Sin embargo, poca utilidad tendrá sin la ayuda de BufferedReader, para poder disponer de métodos más prácticos como readLine.

Como os podéis imaginar, ya os contaba que existe una clase llamada Reader que va a permitir leernos de distintas fuentes en modo caracter. Por ejemplo, utilizando FileReader, como podéis imaginar, vamos a poder leer desde archivos pasándole como referencia el archivo que queremos que lea, y usando el charset que queremos que utilice. En mi caso, si utilizo un FileReader que me permita leer el archivo hola.txt que ya he escrito anteriormente, con esto voy a tener la posibilidad de leer utilizando los métodos de la clase Reader, que son métodos que ya conoceis, así que no me voy a parar mucho en ellos: close, mark, read, reset... y similares. En el caso de read(), tenemos la posibilidad de leer caracter a caracter, sin embargo, se va a devolver como un int para evitar problemas, pero hay que castearlo como caracter. Pero tenéis también la posibilidad de leerlo de forma masiva en búfferes que son arrays de caracteres para poder ir leyéndolo de a pocos. Esta forma de leerlo no es práctica. Podéis usar un CharBuffer pero es una clase avanzada y no todos los libros explican correctamente cómo usar, pero voy a saltar a una clase que usaremos bastante cuando tengamos Readers que queramos usar para leer de forma secuencial cadenas de caracteres. Es, como no podía ser de otro modo, BufferedReader. Es la versión bufferizada de un Reader. Normalmente lo usaremos cuando vayamos a hacer este tipo de ejemplos, porque tiene métodos de utilidad para leer cadenas de caracteres completas, líneas... en fin, esta es la razón por la que lo instancio directamente como un BufferedReader, para usar los métodos que me va a proporcionar. Por eso uso BufferedReader, porque me va a agilizar la lectura. Al igual que su equivalente, BufferedInputStream, lo que hace es bufferizar un Reader y por ello requiere que se le proporcione el nombre de ese Reader que queremos que envuelva. Llamadas a métodos de br, van a envolver llamadas a métodos del read() original de Reader.

BufferedReader nos proporciona funciones útiles, como lines, que nos proporciona un Stream de líneas, si queremos verlo de este modo, o una función muy práctica y simple que lleva años en la biblioteca estandar de Java, que es readLine(). Lo que hace es leer completamente una línea completa, es decir, por debajo, esta función va a llamar sucesivas veces a read() hasta llegar a un delimitador de fin de línea o al final de la cadena de caracteres. En este caso, si atendemos a su funcionamiento y vemos que va a devolver null cuando lleguemos al final de las cadenas de caracteres. Una cosa que podemos hacer aquí es utilizar una variable de tipo String intermedia y poner un bucle do que se ocupe de leer hasta que se haya devuelto un valor nulo. Vamos a inicializar la variable, y pongamos que ch es readLine. Leemos una línea completa que se va a guardar en ch. Si se guarda, valdrá la línea, y si hemos llegado al final valdrá null. De este modo, ahora podemos comprobar que si ch es diferente de null, podemos hacer un println para poner esa cadena que hemos leído. Como digo, esta va a ser la forma más práctica de leer de un Reader usando un BufferedReader salvo que tengamos una necesidad concreta. Ahora tenemos la posibilidad de leer líneas completas. Por supuesto, no es ni de lejos la única clase que nos va a permitir interactuar con un Reader. Tenemos otro tipo de lectores y otro tipo de escáneres y de parsers que nos van a permitir leer caracteres, pero esta va a ser una de las formas más simples, y por supuesto os lo voy a enseñar en ejecución para que veáis que esto nos permite leer línea a línea un archivo de texto.

Desplegar transcripción del episodio

[Música]

Como os podéis imaginar, ya os contaba que existe una clase llamada Reader que va a permitir leernos de distintas fuentes en modo caracter. Por ejemplo, utilizando FileReader, como podéis imaginar, vamos a poder leer desde archivos pasándole como referencia el archivo que queremos que lea, y usando el charset que queremos que utilice. En mi caso, si utilizo un FileReader que me permita leer el archivo hola.txt que ya he escrito anteriormente, con esto voy a tener la posibilidad de leer utilizando los métodos de la clase Reader, que son métodos que ya conoceis, así que no me voy a parar mucho en ellos: close, mark, read, reset... y similares. En el caso de read(), tenemos la posibilidad de leer caracter a caracter, sin embargo, se va a devolver como un int para evitar problemas, pero hay que castearlo como caracter. Pero tenéis también la posibilidad de leerlo de forma masiva en búfferes que son arrays de caracteres para poder ir leyéndolo de a pocos. Esta forma de leerlo no es práctica. Podéis usar un CharBuffer pero es una clase avanzada y no todos los libros explican correctamente cómo usar, pero voy a saltar a una clase que usaremos bastante cuando tengamos Readers que queramos usar para leer de forma secuencial cadenas de caracteres. Es, como no podía ser de otro modo, BufferedReader. Es la versión bufferizada de un Reader. Normalmente lo usaremos cuando vayamos a hacer este tipo de ejemplos, porque tiene métodos de utilidad para leer cadenas de caracteres completas, líneas... en fin, esta es la razón por la que lo instancio directamente como un BufferedReader, para usar los métodos que me va a proporcionar. Por eso uso BufferedReader, porque me va a agilizar la lectura. Al igual que su equivalente, BufferedInputStream, lo que hace es bufferizar un Reader y por ello requiere que se le proporcione el nombre de ese Reader que queremos que envuelva. Llamadas a métodos de br, van a envolver llamadas a métodos del read() original de Reader.

BufferedReader nos proporciona funciones útiles, como lines, que nos proporciona un Stream de líneas, si queremos verlo de este modo, o una función muy práctica y simple que lleva años en la biblioteca estandar de Java, que es readLine(). Lo que hace es leer completamente una línea completa, es decir, por debajo, esta función va a llamar sucesivas veces a read() hasta llegar a un delimitador de fin de línea o al final de la cadena de caracteres. En este caso, si atendemos a su funcionamiento y vemos que va a devolver null cuando lleguemos al final de las cadenas de caracteres. Una cosa que podemos hacer aquí es utilizar una variable de tipo String intermedia y poner un bucle do que se ocupe de leer hasta que se haya devuelto un valor nulo. Vamos a inicializar la variable, y pongamos que ch es readLine. Leemos una línea completa que se va a guardar en ch. Si se guarda, valdrá la línea, y si hemos llegado al final valdrá null. De este modo, ahora podemos comprobar que si ch es diferente de null, podemos hacer un println para poner esa cadena que hemos leído. Como digo, esta va a ser la forma más práctica de leer de un Reader usando un BufferedReader salvo que tengamos una necesidad concreta. Ahora tenemos la posibilidad de leer líneas completas. Por supuesto, no es ni de lejos la única clase que nos va a permitir interactuar con un Reader. Tenemos otro tipo de lectores y otro tipo de escáneres y de parsers que nos van a permitir leer caracteres, pero esta va a ser una de las formas más simples, y por supuesto os lo voy a enseñar en ejecución para que veáis que esto nos permite leer línea a línea un archivo de texto.