13 septiembre 2005

Entrada standard en java

En java, para leer la entrada standard (la del teclado) contamos con System.in

Sin embargo, System.in es un InputStream, que cuenta con pocos métodos útiles para leer el teclado. De hecho, sólo tiene métodos para leer bytes. Si en el teclado escribimos una A mayúscula, System.in nos devolverá un byte 65.

Afortunadamente en java hay muchas clases ya preparadas. Tenemos clases InputStreamReader, BufferedReader, FileReader, etc. Estas clases tienen como misión leer un "flujo" de bytes o de caracteres y darnos métodos que nos faciliten la lectura.

Hay básicamente dos tipos de clases. Las más básicas son las InputStream, que son clases que leen bytes. Sobre ella se construyen los Reader, que son clases que leen caracteres (transforman los bytes a caracteres). Para convertir de una a otra, tenemos el InputStreamReader.

Un InputStreamReader recibe un InputStream en el constructor y se comporta como un Reader, es decir, lector de caracteres. La clase InputStreamReader tiene métodos que nos permite leer char o arrays de char.

Bien, con este trozo de código

InputStreamReader isr = new InputStreamReader(System.in);

ya tenemos un InputStreamReader asociado al teclado y del que podemos leer directamente caracteres, en vez de bytes. Cuando escribamos una A, leeremos una 'A' y no un byte 65.

La siguiente clase que podemos usar es BufferedReader. Esta clase recibe un Reader en el constructor (podemos pasarle nuestro InputStreamReader) y tiene un método para leer una línea completa de teclado, de forma que nos devuelve un String.

BufferedReader bf = new BufferedReader (isr);
String lineaTeclado = bf.readLine();

Estupendo, ya podemos leer líneas de teclado.

El problema ahora es si escribimos un 123, obtendremos "123" como String. Seguramente queramos convertirlo a int, o float o lo que sea. Para ello no nos queda más remedio que analizar la cadena y convertirla al valor que queramos. Por ejemplo, para convertirla a un int, podemos hacer esto

int valor = Integer.parseInt (lineaTeclado);

Por supuesto, se supone que hemos escrito un entero en esa línea y sólo un entero, o saltará una excepción.

El siguiente es un código de ejemplo con todo esto junto:

// Creación de BufferedReader para facilitar la lectura.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

try
{
// Lectura de un entero
System.out.print ("Introduce un número entero : ");
String cadena = br.readLine();
int valor = Integer.parseInt(cadena);
System.out.println ("Has escrito "+valor);

// Lectura de un double
System.out.print ("Escribe ahora un numero flotante : ");
cadena = br.readLine();
double valor2 = Double.parseDouble(cadena);
System.out.println ("Has escrito "+valor2);

} catch (Exception e)
{}

No hay comentarios: