La clase scanner en Java es una de las herramientas más utilizadas para la entrada y lectura de datos. Por ejemplo, un programa java puede leer datos introducidos por teclado o desde archivos entre otras fuentes. Pertenece al paquete java.util de la API de java y proporciona métodos para leer distintos tipos de datos de manera sencilla.
Sin embargo, esta clase, no pertenece al paquete por defecto, por lo tanto, antes de utilizar la clase Scanner en Java, es necesario importarla en nuestro programa.
Importación de la clase scanner en java.
Para importar la clase scanner en nuestro programa, lo podemos hacer de dos maneras:
Importando solo la clase scanner.
import java.util.Scanner;
Podemos importar todas las clases del paquete java.util.
// Importamos el paquete donde se encuentra la clase Scanner
import java.util.*;
Gracias al uso del asterisco (*), estamos importando todas las clases del paquete java.util. Ahora ya podemos trabajar con la clase Scanner.
Una vez importada, se puede instanciar un objeto scanner para leer datos de entrada. El caso más común es leer desde introducidos por teclado usando System.in.
Creación de un objeto scanner.
Para leer datos desde el teclado, se debe crear un objeto de la clase Scanner en Java de la siguiente manera:
- Declaramos una variable. Esta variable se llama variable objeto, ya que va a almacenar un objeto, en este caso de tipo Scanner.
- Hacemos uso de la palabra reservada new.
Modificador de acceso + Nombre de la clase + nombre que queramos dar a la variable = new + Nombre de la clase;
En este caso, crearemos un objeto de tipo Scanner al que llamaremos lectura, y le pasaremos por parámetro lo que el usuario vaya a introducir en la consola. Esto se lo indicamos con el atributo in de la clase System.
Scanner lectura = new Scanner(System.in);
Este objeto scanner permite leer distintos tipos de datos, como números enteros, decimales, cadenas de texto, caracteres, etc.
Métodos principales y ejemplos de la clase scanner en java.
Algunos de los métodos más utilizados para la lectura de datos:
Lectura de cadenas de texto
- next(): Lee una palabra hasta encontrar un espacio o un salto de línea.
- nextLine(): Lee una línea completa de texto (hasta encontrar un salto de línea).
package arranque;
// Importamos el paquete donde se encuentra la clase Scanner
import java.util.*;
public class Principal {
// Creamos un objeto de tipo Scanner que llamaos lectura
private static Scanner lectura = new Scanner(System.in);
public static void main(String[] args) {
// Declaramos una vairable tipo texto
String miNombre="";
// Mostramos un mensaje por pantalla
System.out.println("Escribe tu nombre:");
// Guardo el dato en la variable miNombre.
miNombre=lectura.nextLine();
// Muestro la variable por consola
System.out.println("Tu nombre es: " + miNombre);
// Cierro el objeto scanner para librar recursos
lectura.close();
}
}
Si vemos la última línea de código de este ejemplo, vemos que hemos cerrado el objeto lectura con el método close(). Esto es muy importante. Cuando se deja de utilizar un objeto en java, debemos cerrarlo para evitar consumir recursos de nuestro ordenador. Además, cuando un objeto se cierra, éste se destruye automáticamente. Por este motivo en java no existen destructores.
Diferencia entre el método next() y el método nextLine().
Cuando queremos leer datos a través de un objeto de la clase scanner, debemos tener en cuenta que podemos hacerlo a través del método next() o bién a través del método nextLine(). ¿Pero cual es la diferencia entre uno y otro?
Imaginemos que a la hora de escribir el nombre, escribimos el nombre y los apellidos. Entonces en lugar de escribir solo, por ejemplo, «Cristina«, escribimos lo siguiente: «Cristina Alonso Martín«.
En este caso, si para leer el dato e introducirlo en una variable, usamos el método next(), se guardaría en la variable tan sólo «Cristina» más el siguiente espacio en blanco.
Sin embargo, al utilizar el método nextLine(), se leería y se guardaría en la variable el nombre completo, que en este caso sería «Cristina Alonso Martín«.
Lectura de números.
- nextInt(): Lee un número entero (int).
- nextLong(): Lee un número largo (long).
- nextFloat(): Lee un número flotante (float).
- nextDouble(): Lee un número decimal (double).
System.out.print("Ingresa tu edad: "); // Pedimos la edad
int edad = lectura.nextInt(); // Leemos la edad
System.out.println("Tienes " + edad + " años."); // Mostramos la edad
lectura.Close(); // Cerramos el objeto scanner
Lectura de caracteres y Valores booleanos.
- next().charAt(0): Obtiene el primer carácter de una cadena ingresada.
- nextBoolean(): Lee un valor booleano (true o false).
System.out.print("Ingrese una letra: ");
char letra = lectura.next().charAt(0);
System.out.println("Letra ingresada: " + letra);
El buffer de la clase scanner en Java.
Para explicar este apartado, vamos a tener en cuenta el siguiente código.
package ejerciciosSystemIn;
/* Importamos todas las clases del
* paquete java.util.*/
import java.util.*;
public class ClasePrincipal {
public static void main(String[] args) {
// Declaramos el objeto scanner
Scanner lectura=new Scanner(System.in);
// Variable para almacenar el nombre
String miNombre="";
// Variable para Almacenar la edad
int edad=0;
// Ahora pedimos su edad y la guardamos en edad
System.out.println("Escribe tu edad:");
/* Hasta aquí, declaramos dos variables y les
* damos un valor inicial.*/
// Pedimos la edad y lógicamente la tecleamos
/* Para enviarla a la variable, primero se almacena
* en un buffer*/
}
}
El buffer de la clase scaner, es una parte de la memoria del ordenador que se reserva para almacenar datos que provienen desde los periféricos de entrada como por ejemplo un teclado, antes de ser procesados. Esto quiere decir que los datos que se teclean hacen el siguiente recorrido.
- Se escribe un dato y al pulsar ENTER, este se envía a la memoria del ordenador.
- Un buffer, recibe los datos del usuario. El buffer recibirá por un lado el dato enviado y por otro la pulsación del ENTER en un código Ascii.
- Una vez que el buffer recibe el dato, lo pasa a la variable correspondiente.
¿Qué recibe y almacena el buffer de entrada de datos en Java?
Cuando se ingresa un dato mediante el teclado y se presiona «Enter», el sistema operativo envía los datos a un buffer de entrada. La clase Scanner en Java procesa estos datos desde el buffer, permitiendo al programa leerlos.
Por ejemplo, si el usuario ingresa 25
y presiona ENTER, el Scanner lee 25, pero el salto de línea (\n) puede quedar en el buffer.
edad=lectura.nextInt();
/* Cuando llega a esta instrucción, envia el número 25
* quedándose con el caracter \n en su interior. (Un salto de línea)*/
Si en este momento, le pedimos un nombre al usuario para almacenarlo en una variable, el programa no nos hará caso.
¿Por qué pasa esto?
Esto es debido a que cuando el enviamos un dato a una variable primero el programa comprueba que el buffer esté vacío. Y en este caso el buffer tiene un caracter “\n” almacenado. Esto para el buffer de java es considerado de tipo de dato String, es decir, un tipo texto. Por ese motivo al invocar al método nextline(); en la variable miNombre almacena un caracter en blanco. Esto es porque está leyendo el salto de línea que esta almacenado en el buffer.
Como hacer la limpieza del buffer de entrada en java.
El buffer de entrada puede almacenar caracteres residuales que pueden afectar la lectura de datos en un programa. Esto ocurre, por ejemplo, cuando se usa nextInt() seguido de nextLine(), donde nextInt() solo lee el número y deja el salto de línea (\n) en el buffer.
Solución: Uso de scanner.nextLine()
Para evitar este problema, se recomienda limpiar el buffer con scanner.nextLine() después de leer un número. De esta manera el código de nuestro programa a la hora de pedir los datos, quedaría de la siguiente manera.
System.out.print("Ingresa tu edad: ");
int edad = lectura.nextInt();
lectura.nextLine(); // Limpia el buffer
System.out.print("Ingrese su nombre: ");
miNombre = scanner.nextLine();
System.out.println("Nombre: " + miNombre+ ", Edad: " + edad);
Preguntas frecuentes (FAQs).
import java.util.Scanner;
, generalmente al inicio del código Java.nextInt()
para enteros, nextDouble()
para decimales y nextLine()
para texto.nextLine()
, que captura todo el texto ingresado.next()
lee hasta el primer espacio, mientras que nextLine()
captura toda la línea de texto.close()
libera recursos del sistema cuando Scanner ya no es necesario.nextInt()
, que permite capturar y convertir el valor ingresado en un entero.