Cómo usar la clase BufferedReader para introducir datos desde teclado
Una vez más es un gusto saludar a mis lectores. En esta ocasión les traigo información sobre uno de los primeros pasos en la elaboración de un programa: introducir datos.
El proceso de la información
En la figura 1 te muestro el proceso de la información. Te recuerdo que este proceso es el principal objetivo de la ciencia de la computación. Desarrollamos software con la finalidad de convertir datos de entrada en información útil para que el cliente pueda tomar decisiones.

Figura 1. El proceso de la información
Como ya mencioné en una entrada previa, los datos son el primer elemento de este proceso. Un software puede recibir los datos de entrada desde diversos dispositivos, y a su vez los datos pueden tener diversas formas: una señal electrónica leída a través de un puerto de entrada, un archivo que se recibe a través de la red, una orden hablada en lenguaje natural, etc. Pero la forma más común es la introducción de datos a través de un teclado de computadora, y eso es lo que en los programas iniciales se requiere.
En el lenguaje Java se pueden introducir datos a través del teclado de dos formas:
- Usando la clase Scanner
- Usando las clases BufferedReader e InputStreamReader
Flujo de entrada (stream)
Un flujo de entrada (stream) en Java representa una fuente de entrada. Un flujo se enlaza a un dispositivo físico para realizar operaciones de entrada.
Para que puedas entender mejor el término de “flujo”, tomo prestada una explicación que encontré en el que yo considero es uno de los mejores sitios para resolver dudas sobre programación: CodeRanch.
Un flujo son datos que a los que puedes acceder en secuencia
https://coderanch.com/t/527192/java-io/java/stream-java por Greg Charles
Personalmente lo que a mí me funciona para entender el concepto de flujo es pensar en una llave de agua. (Observa la figura 2) Suponiendo que existe un suministro constante de agua, cada vez que abro la llave tendré agua, es decir un flujo continuo del líquido.

Figura 2. Concepto de flujo de entrada
En el caso de un programa, existe un flujo continuo de datos de entrada a través del teclado, el cual suponemos siempre accesible para que el usuario pueda presionar cualquier tecla. Entonces en este ejemplo, existen los datos, pero necesitamos “atraparlos” en algo. Es casi como si siempre tuviéramos la llave del agua abierta: si no colocamos una cubeta o balde, estaríamos desperdiciando el agua.
Entonces un flujo representa una interface uniforme entre el programa y los dispositivos de entrada, proporcionando una ruta a lo largo de la cual fluyen los datos. El flujo tiene una fuente y un destino, los cuales pueden ser dispositivos físicos o programas, o incluso otro flujo.
Clases utilizadas
La clase InputStreamReader
La clase InputStreamReader es una clase que funciona como “puente” entre el flujo de bytes y el flujo de caracteres, ya que lee bytes y los decodifica en caracteres, usando un charset específico.
Cada llamado a uno de los métodos read de InputStreamReader debe causar que uno o más bytes sean leídos desde el flujo de entrada de bytes subyacente.
System.in
En Java se accede a la entrada estándar a través del campo estático in de la clase java.lang.System.
El campo in representa el flujo de entrada estándar. Este flujo está siempre abierto y listo para suministrar datos de entrada, y por lo general corresponde a la entrada por teclado.
Los elementos de éste flujo son caracteres individuales, no cadenas de texto, por lo que es conveniente utilizar un objeto de InputStreamReader inicializado con System.in, para convertir los bytes leídos en caracteres.
La clase BufferedReader
Esta clase lee texto desde un flujo de entrada de caracteres, almacenando los caracteres para proporcionar una lectura eficiente de caracteres, arreglos y líneas.
Se puede configurar específicamente el tamaño del bufer, o usar el que se otorga por default, el cual es suficientemente grande para la mayoría de los casos.
Dado que esta clase extiende de Reader, cada petición de lectura causa una petición de lectura del flujo de entrada, por lo que es aconsejable envolverla con la clase InputStreamReader o FileReader, según el propósito de la lectura.
Juntando todo.
Hasta aquí puede parecer todo demasiado complicado, pero en realidad es más sencillo de lo que parece. Toda esta teoría te lleva a crear la siguiente línea:
BufferedReader bufer = new BufferedReader(new InputStreamReader(System.in));
La explicación de esta línea la puedes ver en la figura 3.

Figura 3. Creación de un objeto de la clase BufferedReader
Un búfer no es más que un área de almacenamiento. En la figura 2, correspondería a la cubeta etiquetada con la palabra “Destino”, es decir, un cubo de almacenamiento donde se recogen los datos que se recuperaron del flujo de entrada.
Ahora que ya ha sido creado el búfer de entrada, sólo se necesita invocar al método readLine de la clase BufferedReader, el cual regresa un objeto tipo String, de la siguiente forma:
entrada = bufer.readLine();
De tal modo que en entrada tenemos los caracteres leídos desde el teclado.
¿Y cómo leer los otros tipos de datos?
Hasta el momento tenemos un objeto tipo String en entrada, recuperado del flujo de entrada del teclado. Pero como sabemos, los programas necesitan diferentes tipos de datos y no necesariamente caracteres. Por eso ahora debemos convertir el String en su correspondiente tipo de dato. Para ello se usará la clase y el método de conversión adecuado (parse), como se muestra en la figura 4.

Figura 4. Clases y métodos para convertir caracteres a los tipos de datos primitivos
De esta forma, si quieres obtener un entero, deberás utilizar la conversión apropiada como se muestra en la figura 5:

Figura 5. Convirtiendo un String a int
Ejemplo
Ahora en el archivo adjunto: programaLectura te muestro un programa que lee datos desde el flujo de entrada estándar y los convierte a cada uno de los tipos de datos primitivos de Java.
/* * Programa que lee caracteres del flujo de ntrada estándar * Y los convierte a cada uno de los tipos de datos primitivos de Java */ package ejblog2; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; /** * * @author Gaby Nieva * dcodingames.wordpress.com */ public class EjBlog2 { /** * @param args the command line arguments * @throws java.io.IOException */ public static void main(String[] args) throws IOException { // TODO code application logic here BufferedReader bufer = new BufferedReader(new InputStreamReader(System.in)); int x; float y; double z; boolean b; char c; String entrada; String cadena; System.out.println("Programa que lee datos"); System.out.println("Escribe un valor entero: "); entrada = bufer.readLine(); x = Integer.parseInt(entrada); System.out.println("Escribe un valor flotante: "); entrada = bufer.readLine(); y = Float.parseFloat(entrada); System.out.println("Escribe un valor double: "); entrada = bufer.readLine(); z = Double.parseDouble(entrada); System.out.println("Escribe un valor booleano: "); entrada = bufer.readLine(); b = Boolean.parseBoolean(entrada); System.out.println("Escribe un caracter: "); entrada = bufer.readLine(); c = entrada.charAt(0); System.out.println("Escribe una cadena de caracteres: "); entrada = bufer.readLine(); cadena = entrada; System.out.println("Mostrando los datos introducidos: "); System.out.println("El valor entero es: " + x); System.out.println("El valor flotante es: " + y); System.out.println("El valor double es: " + z); System.out.println("El valor booleano es: " + b); System.out.println("El caracter es: " + c); System.out.println("La cadena de caracteres es: " + cadena); } }
Observa lo siguiente:
- Sólo es necesario declarar un objeto BufferedReader una sóla vez. Este objeto se utilizará tantas veces sea necesario para obtener datos de entrada.
- La petición del método readLine de BufferedReader puede lanzar una excepción, por lo que es necesario indicarlo agregando la cláusula: throws IOException en el encabezado del método main.
- Y por lo tanto, se debe importar el paquete: import java.io.IOException;
- String es en realidad una clase de Java, no un tipo primitivo de datos, pero su uso es tan popular que a menudo se confunde con los tipos de datos primitivos.
En la figura 6 te muestro la ejecución de este programa:

Figura 6. Ejecución del programa de Lectura de datos
Con este ejemplo termina este post, esperando que sea de utilidad. Y ya sabes, si te ha gustado regálame un “like” y compártelo en tus redes.
Excelente explicacion no lograba conseguir un explicacion que me diera a entender com o usar buffer
Gladys Obet Huerta Martínez.
Guadalupe Bonilla Lopez
Que buena explicación…