lunes, 8 de agosto de 2011

■ Lectura de Datos con BufferedReader

En Java existen dos maneras básicas para la lectura o introducción de datos por medio del teclado, éstas son: utilizando el método BufferedReader o utilizando un objeto de la clase Scanner. (Lectura de datos con Scanner)

En esta ocasión mostraré la forma de hacerlo mediante el método BufferedReader.


■ BufferedReader

Antes que nada, para utilizar BufferedReader es necesario importar los paquetes:
  • BufferedReader
  • InputStreamReader
  • IOException

Esto es porque necesitamos crear un objeto del tipo BufferedReader el cual recibe como parámetro un objeto de la clase InputStreamReader, además el uso del BufferedReader requiere forzosamente del manejo de excepciones por ello es necesario importar la clase IOException.

• Declaración del objeto BufferedReader:
BufferedReader br = new BufferedReader (new InputStreamReader (System.in));

Siendo "br" el objeto que usaremos para la lectura.

• Lectura y almacenado en una variable:
dato = br.readLine();

Donde "dato" es una variable del tipo String, solo en este caso la asignación de la lectura se hace de forma directa a la variable, ésto porque cuando leemos datos del teclado mediante BufferedReader lo que en realidad recibimos son cadenas de texto mismas que se pueden almacenar directamente en un String. 

• ¿Qué pasa con los números u otros tipos?
Si lo que nos interesa son leer números, ya sean enteros o decimales, forzosamente debemos realizar una "conversión" de la cadena leída a número.

Por ejemplo si nosotros introducimos el número 123, el programa lo tomará como texto y no como número, por lo que si queremos hacer operaciones con tal número debemos convertir la lectura a entero, para esto se emplea el método "parse" y almacenar la conversión en una variable del mismo tipo al cual se ha convertido, por ejemplo si queremos leer un número entero se haría de la siguiente forma:

int dato;
dato = Integer.parseInt(br.readLine());

Con esto haremos que los números ingresados sean convertidos a entero y puedan ser almacenados en una variable entera.


■ Pero ¿qué pasa si ingresamos un caracter que no sea numérico?
En el caso de que el usuario introduzca un caracter diferente a un número se producirá un error de lectura y automáticamente se cerrará el programa, aquí es donde entra el manejo de excepciones.

Para controlar este tipo de errores (de lectura) se debe colocar el código donde se hace la lectura de datos por el teclado dentro de un bloque try - catch, esto es de la siguiente forma:

try {
     variableInt = Integer.parseInt(br.readLine());
} catch (IOException e) {
     //Lo que queremos que se haga en caso de error de lectura
}


■ Ejemplo: Leer texto y mostrarlo en pantalla:

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

public class LecturaTeclado {
   public static void main (String args[]) {
      String dato;
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      try {
         System.out.print("Introduce texto: ");
         dato = br.readLine();
         System.out.print("El texto fue: " + dato);
      } catch (IOException e) {
          System.out.println(e);
      }
   }
}


Nota: El import de las clases BufferedReader, InputStreamReader y IOException puede englobarse en una sola línea importando todas las clases del paquete "io" de la siguiente forma:

import java.io.*;

6 comentarios:

  1. muy claro y preciso... Gracias

    ResponderEliminar
  2. preciso pero quisiera saber si un public void de esta manera funcionaria
    public void sum () throws IOException

    ResponderEliminar
  3. Claro, preciso y ejemplarizado

    ResponderEliminar
  4. Gracias muy claro y preciso

    ResponderEliminar
  5. cómo puedo leer más de una linea del buferedreader?

    ResponderEliminar
  6. Saludos, Actualmente estoy simulando la combinación de golang con java, esto motivado que ambos pueden trabajar con json.
    La inquietud es la siguiente, si golang respnnde por el browser a un puerto por ejemplo 3000 y localhost, porque java cuando se utiliza este codigo.
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.URL;
    public class NetClientGet {
    // http://localhost:8080/RESTfulExample/json/product/get
    public static void main(String[] args) {
    try {
    URL url = new URL("localhost:3000/people/");
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setRequestMethod("GET");
    conn.setRequestProperty("Accept", "application/json");
    if (conn.getResponseCode() != 200) {
    throw new RuntimeException("Failed : HTTP error code : "
    + conn.getResponseCode());
    }
    BufferedReader br = new BufferedReader(new InputStreamReader(
    (conn.getInputStream())));
    String output;
    System.out.println("Output from Server .... \n");
    while ((output = br.readLine()) != null) {
    System.out.println(output);
    }

    conn.disconnect();

    } catch (MalformedURLException e) {

    e.printStackTrace();

    } catch (IOException e) {

    e.printStackTrace();

    }

    }

    }
    Responde esto:
    java.net.MalformedURLException: unknown protocol: localhost
    at java.net.URL.(Unknown Source)
    at java.net.URL.(Unknown Source)
    at java.net.URL.(Unknown Source)
    Gracias y disculpen mi falta de conocimiento.

    ResponderEliminar