lunes, 1 de octubre de 2012


Como introducir por medio del teclado en java
Leer la entrada desde el teclado en Java
Mediante un ejemplo sencillo vamos a explicar como podemos leer las entradas en Java, es decir, todo lo que introducimos mediante el teclado. Para esto utilizaremos dos clases contenidas en el paquete de entrada/salida de java (java.io), estas clases son: InputStreamReader y BufferedReader, además del flujo de entrada System.in.

Nada más para recordar como se manejan los flujos de datos en Java:

System – es el nombre de la clase estándar que contiene objetos que encapsulan las entradas y salidas (I/O) de nuestro sistema (entrada – todo lo que introducimos mediante el teclado, salida - lo que se despliega en la pantalla). Esta clase forma parte del paquete java.lang, por ello siempre está disponible.
in – representa la entrada estándar, lo que introducimos mediante el teclado. Esta clase es miembro de la clase System.

Después de un poco de teoría, veamos cómo seria el código.

1.- Primero tenemos que importar el paquete io de java de la siguiente manera:

import java.io.*;

2.- Construimos un método para la lectura de entradas de tipo String, en este método utilizaremos las clases InputStreamReader y BufferedReader, además del objeto System.in para leer las entradas:

publicstaticStringleerEntrada() {
String salida = "";
try{
// Definimos un flujo de caracteres de entrada: leerEntrada
BufferedReaderleerEntrada = new BufferedReader(new InputStreamReader(System.in));
// Leemos la entrada, finaliza al pulsar la tecla Entrar
salida = leerEntrada.readLine();
} catch( IOException e) {
System.err.println("Error: " + e.getMessage());
}
return salida; // Devuelve el dato tecleado
}

Si construiremos nuestra clase e integramos el método main() nos quedaría de esta manera:

import java.io.*;

publicclassLeerEntrada {
publicstaticStringleerEntrada() {
String salida = "";

try{
// Definimos un flujo de caracteres de entrada: leerEntrada
BufferedReaderleerEntrada = new BufferedReader(new InputStreamReader(System.in));
// Leemos la entrada, finaliza al pulsar la tecla Entrar
salida = leerEntrada.readLine();
} catch( IOException e) {
System.err.println("Error: " + e.getMessage());
}
return salida; // Devuelve el dato tecleado
}

publicstaticvoidmain(Stringargs[]){
String algo = "";
LeerEntradaleerEntrada = new LeerEntrada();
System.out.println("Escribe algo: ");
algo = leerEntrada.leerEntrada();
System.out.println(algo);
}

}

Después compilamos la clase para crear el .class y finalmente la ejecutamos mediante el intérprete de java de la siguiente manera:

java LeerEntrada

La salida deberá ser algo parecido a esto:
Escribe algo: escribimos algo
escribimos algo





La Clase Scanner
La clase Scanner que se introdujo a partir de java 5 tiene varias utilidades. Puede separar o romper su dato de entrada en subcadenas o “tokens” y además convertir estos datos en tipos primitivos como enteros, flotantes, etc. Por ejemplo, puedo pasarle un dato String como argumento al constructor, definir su patrón delimitador (por defecto: espacio en blanco) y obtener subcadenas cuyos miembros debo recoger uno a uno mediante el método next() o algunos de sus similares (nextInt(), nextByte()… para cada dato primitivo existe un next()), veamos un pequeño programa:

public static void main(String[] args) {
    String cadena = "Blog_Acerca_de_Java";
    Scanner s = new Scanner(cadena);
    s.useDelimiter("_");
    while(s.hasNext()){
        System.out.println(s.next()); //s.next() devuelve cadena token
    }
}

En este programa se separarán en subcadenas separando por “_” y se muestra cada término en una línea en la consola de java. Este tipo de uso es muy similar a usar la clase
 StringTokenizer.
Por otro lado, la clase Scanner también tiene un constructor que recibe un InputStream, por lo que podemos pasarle al mismo la sentencia System.in para leer datos desde el teclado:

public static void main(String[] args) {
    System.out.print("Introduzca datos: ");
    Scanner s = new Scanner(System.in); 
    System.out.println(s.next());
    System.out.println(s.nextInt());
    System.out.println(s.nextLine());
}

Este último código lee datos a partir del teclado, separa en subcadenas con espacio en blanco como delimitador, lee la primera cadena y la imprime en consola, espera un espacio, después busca el siguiente dato e intenta convertirlo a entero (int) si no puede hacerlo lanza un InputMismatchException y se detiene, de no lanzar la excepción lee el siguiente dato hasta el final de la línea y lo imprime.
Otro constructor que también nos beneficia es el que recibe un archivo como parámetro. Supongamos que tenemos un archivo con esta información: