miércoles, 9 de noviembre de 2016

Introducir y Leer Datos con las Clases InputStreamReader y BufferedReader

Si seguís o habéis visto algunos tutoriales del blog del curso de Java os habréis fijado de que cada vez que nos ha hecho falta introducir y/o leer un dato por teclado hemos utilizado la clase Scanner, sino podéis echar un vistazo a Cómo utilizar la clase Scanner. Java introdujo esta clase para facilitarnos el uso de entrada/salida de datos, pero esta clase no nos servirá por ejemplo si queremos leer en flujos de datos como por ejempolo si queremos leer un archivo, no lo podemos hacer con la clase Scanner porque necesitamos herramientas para leer flujos de datos. 
En esta entrada vamos a aprender cómo introducir y leer estos flujos con la clase InputStreamReader y BufferedReader
Como siempre digo, debemos de ir a la documentación de la API de Java para poder comprender mejor cómo trabajan las clases y buscamos la clase InputStreamReader. Una vez en ella, podemos ver que InputStreamReader es subclase de la clase Reader.

Si leemos su definición nos dice que la clase InputStreamReader es un puente de flujos de bytes a un flujo de caracteres. Lee en bytes y luego lo decodifica en caracteres.
Ahora para entender mejor su funcionamiento vamos a ver los constructores de esta clase

Nosotros vamos a utilizar el primer constructor. El primer constructor nos dice que tenemos que pasarle un tipo de dato de tipo InputStream. Le pasaremos un System.in como parámetro, porque System.in es una instancia de la clase InputStream como podemos ver en la siguiente imagen.






Bueno, la declaración y la creación del objeto de la clase InputStreamReader quedaría de la siguiente manera:




InputStreamReader isr = new InputStreamReader(System.in);

Para utilizar esta clase debemos de importarla:

import java.io.InputStreamReader;

Ahora ya tenemos un objeto creado y podremos utilizar sus métodos. Si seguimos mirando la documentación de Java de la clase InputStreamReader podemos ver los métodos que podemos utilizar. Nosotros queremos leer datos por teclado, por lo que el método que parece más adecuado es el de read(). Pero si leemos la descripción de este método podemos ver que lee un sólo carácter y el valor devuelto es un entero, por lo tanto no podremos leer letras, ni por supuesto, frases. 

¿Cómo podemos entonces hacer para leer frases?

Para esto, utilizaremos la clase BufferedReader. Esta clase lo que hace es leer un flujo de caracteres de entrada y lo pasa a texto. 
Pues nada, vamos a ver sus constructores para ver cómo podemos trabajar con dicha clase.





Nosotros vamos a utilizar el primer constructor, que nos indica que debemos de pasarle como parámetro un dato de tipo Reader, que si os acordáis, habíamos dicho que la clase InputStreamReader era subclase de la clase Reader, por lo que podremos pasarle un objeto de la clase InputStreamReader.
Quedaría de la siguiente manera:


import java.io.BufferedReader;
import java.io.InputStreamReader;


public class EntradaSalida {

    public static void main(String[] args) {
       InputStreamReader isr = new InputStreamReader(System.in);
       BufferedReader br = new BufferedReader(isr);
    }    
}

Ahora sólo nos queda mirar los métodos que podemos utilizar de la clase BufferedReader.

Vamos a utilizar el método readLine(); para realizar la lectura de líneas enteras, este método nos devuelve un tipo String, por lo que se debe de guardar la lectura en un dato de tipo String. El código completo de un programa que introduce una frase por teclado y luego la muestra es el siguiente:



import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class EntradaSalida {

    public static void main(String[] args) throws IOException {
       InputStreamReader isr = new InputStreamReader(System.in);
       BufferedReader br = new BufferedReader(isr);
       
        System.out.print("Introduce una frase: ");
        String frase = br.readLine();
        System.out.println(frase);
    }    
}

Debemos de incluir las posibles excepciones de entrada-salida que puedan haber.
Como último apunte decir que, podemos simplificar un poco el código y crear la instancia de la clase InputStreamReader dentro del constructor de la clase BufferedReader de la siguiente manera:


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class EntradaSalida {

    public static void main(String[] args) throws IOException {
       BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
       
        System.out.print("Introduce una frase: ");
        String frase = br.readLine();
        System.out.println(frase);
    }    
}

No hay comentarios:

Publicar un comentario

Related Posts Plugin for WordPress, Blogger...