Java
Java Scanner para lectura de datos
La clase Scanner está disponible a partir de Java 5 y facilita la
lectura de datos en los programas Java.
Para utilizar Scanner en el programa tendremos que hacer lo
siguiente:
1. Escribir el import 3. Utilizar el Scanner
La clase Scanner se encuentra en el paquete Para leer datos desde teclado con Scanner
[Link] por lo tanto se debe incluir al inicio podemos usar los métodos nextXxx() donde Xxx
del programa la instrucción: indica el tipo de dato a leer:
import [Link];
•nextInt() para leer un dato de tipo int.
•nextFloat() para leer un dato de tipo float.
2. Crear un objeto Scanner •nextDouble() para leer un dato de tipo double.
Tenemos que crear un objeto de la clase •nextBoolean() para leer un dato de tipo boolean.
Scanner asociado al dispositivo de entrada. •nextLine() para leer un String hasta encontrar un
Si el dispositivo de entrada es el teclado salto de línea.
•next() para leer un String hasta el primer
escribiremos:
delimitador, generalmente hasta un espacio en blanco
Scanner sc = new Scanner([Link]); o hasta un salto de línea.
Ejemplos de lectura:
Ejemplo de lectura por teclado de un número entero (tipo int):
int n;
[Link]("Introduzca un número entero: ");
n = [Link](); //asigna a la variable n el número entero introducido
por teclado
Si el valor introducido por teclado no es del tipo
esperado o de un tipo compatible al esperado, se
produce un error. En este caso se lanza la
excepción InputMismatchException
import [Link];
public class Ejemplo1Scanner {
public static void main(String[] args) {
Scanner sc = new Scanner([Link]);
String nombre;
double radio;
int n;
[Link]("Introduzca su nombre: ");
nombre = [Link]();
[Link]("Hola " + nombre + "!!!");
[Link]("Introduzca el radio de la circunferencia: ");
radio = [Link]();
[Link]("Longitud de la circunferencia: " + 2*[Link]*radio);
[Link]("Introduzca un número entero: ");
n = [Link]();
[Link]("El cuadrado es: " + [Link](n,2));
}
}
Funcionamiento interno de la clase Java Scanner.
• Los datos que se introducen desde teclado se almacenan en una zona de memoria que
vamos a llamar buffer.
• Mediante un stream estos datos pasan al programa.
Un stream o flujo de datos es un objeto que hace de intermediario entre el programa
y el origen o el destino de los datos. El programa lee del stream o escribe en él, sin
importarle de donde proceden los datos físicamente o hacia qué dispositivo se dirigen
realmente.
Java crea de forma automática los siguientes streams cuando se ejecuta un programa:
• [Link]: stream de entrada conectado al teclado
• [Link]: stream de salida conectado al monitor
• [Link]: stream de salida conectado al monitor para mensajes de error.
Además de estos streams estándar, java proporciona una gran cantidad de clases para
streams que permiten leer y escribir en ficheros.
Cómo limpiar el buffer de entrada en Java
Podemos limpiar el buffer mediante dos métodos:
• next() extrae del buffer el siguiente token en forma de String. Debemos tener en
cuenta que este método solo extrae un token, si hubiese más permanecerían en el
buffer.
• nextLine() extrae del buffer un String con todo el contenido del buffer hasta
encontrar un salto de línea. El salto de línea no se incluye en el String devuelto. El
salto de línea se elimina del buffer.
Cuando se introducen datos de distinto tipo desde teclado habrá
situaciones en la que será necesario eliminar totalmente el contenido
del buffer de entrada. De otro modo la lectura de datos no se realizará
de forma correcta, en particular cuando se intenten introducir datos de
tipo String.
Ejemplo: Programa que lee por teclado el nombre, edad y dirección de una persona y lo muestra por
pantalla.
import [Link]; Si lo ejecutamos vemos que la
public class Ejemplo3Scanner { lectura de datos no se realiza de
public static void main(String[] args) { forma correcta:
Scanner sc = new Scanner([Link]);
String nombre, direccion;
int edad; Introduce tu nombre: Juan Redondo
[Link]("Introduce tu nombre: "); Introduce tu edad: 25
nombre = [Link](); //leer el nombre Introduce tu dirección: Datos introducidos
[Link]("Introduce tu edad: "); Nombre: Juan Redondo
edad = [Link](); //leer la edad Edad: 25
[Link]("Introduce tu dirección: ");
Dirección:
direccion = [Link](); //leer la dirección
[Link]("Datos introducidos");
[Link]("Nombre: " + nombre);
[Link]("Edad: " + edad);
[Link]("Dirección: " + direccion);
}
}
Se ha leído por teclado el nombre y la edad pero el programa no se ha detenido para que el
usuario introduzca la dirección por lo que la variable dirección queda sin valor.
La explicación a lo que ha ocurrido podemos verla de forma gráfica:
Primero se introduce el nombre por teclado:
La siguiente operación de lectura por teclado es la edad:
La siguiente operación de lectura por teclado es la dirección:
Después de leer la edad, el intro permanece en el buffer y si después
intentamos leer un String, la lectura por teclado no se realizará.
La solución es sencilla:
Limpiar el buffer después de leer el número entero mediante el método nextLine();
import [Link];
El programa quedaría así: Ahora, después de introducir la
public class Ejemplo3Scanner { edad, el método nextLine() elimina
public static void main(String[] args) { el intro que ha quedado en el buffer
Scanner sc = new Scanner([Link]); por lo que la lectura de la dirección
String nombre, direccion; se realizará de forma correcta.
int edad;
[Link]("Introduce tu nombre: ");
nombre = [Link](); //leer el nombre
[Link]("Introduce tu edad: "); Introduce tu nombre: Juan Redondo
edad = [Link](); //leer la edad Introduce tu edad: 25
[Link](); //limpiar el buffer de entrada Introduce tu dirección: c/Mayor 134 - Asunción.
[Link]("Introduce tu dirección: ");
direccion = [Link](); //leer la dirección Datos introducidos
[Link]("Datos introducidos"); Nombre: Juan Redondo
[Link]("Nombre: " + nombre); Edad: 25
[Link]("Edad: " + edad);
Dirección: c/Mayor 134 –Asunción.
[Link]("Dirección: " + direccion);
}
}
Ejercicio Scanner
Programa que calcule el precio de venta de
un producto conociendo el precio por unidad
(sin IVA) del producto, el número de
productos vendidos y el porcentaje de IVA
aplicado. Los datos anteriores se leerán por
teclado al igual que el nombre del producto.