Saltar al contenido

Clase Scanner en java. Lectura de datos.

Lo primero que debes saber, es que la clase Scanner, es una clase de la API de java, que se utiliza para leer datos que el usuario introduce por teclado.

Sin embargo, esta clase, no pertenece al paquete por defecto con el que se trabaja cuando se crea un nuevo proyecto.

Para que se entienda. Cuando se crea un nuevo proyecto en java, podemos empezar a mostrar mensajes por consola. Esto se debe a que cuando se crea el proyecto nuevo, se incluye por defecto el paquete java.lang donde se encuentra la clase System.

Por este motivo, para leer datos que se introducen en la consola, vamos a utilizar lo siguiente:

En primer lugar, el atributo in de la clase System, que pertenece la paquete de java por defecto (java.lang).

Y a continuación, un objeto de la clase Scanner, que pertenece a otro paquete llamado java.util.

Ya habíamos dicho, que las clases en java son moldes donde se detallan las características y propiedades de un objeto, ¿verdad?

Pues ahora vamos a crear una instancia de la clase Scanner. Es decir, vamos a crear un objeto para poder leer información introducida en la consola.

Lo primero que debemos hacer es importar el paquete donde se encuentra la clase Scanner, y eso lo hacemos con la palabra reservada «import«. Lo haremos siempre a continuación del paquete.

package arranque;

// Importamos el paquete donde se encuentra la clase Scanner
import java.util.*;

Con la instrucción anterior, estamos importando todas las clases del paquete java.util gracias a que hemos colocado un «.*«. Ahora ya podemos trabajar con la clase Scanner.

Índice de contenidos

    ¿Como realizamos una instancia de la clase Scanner?

    Para crear un objeto tipo Scanner debemos declarar una variable. Esta variable se llama variable objeto, ya que va a almacenar un objeto, en este caso de tipo Scanner.

    Además, debemos hacer uso de la palabra reservada new. De forma que para instanciar, ejemplarizar, o crear un objeto de la clase Scanner, lo haremos de la siguiente manera:

    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 dentro de una clase que llamaremos Principal, y que contendrá el método main. A este objeto, 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.

    Además, crearemos la variable a nivel de clase para poder utilizarla en todos los métodos de la clase donde es declarada.

    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) {
    	
    	}
    }
    

    Uso de un objeto tipo Scanner para la lectura de información en java.

    Una vez que ya hemos creado el objeto al cual hemos llamado lectura, podemos acceder a diferentes métodos de la clase Scanner para leer cualquier tipo de dato. En este caso solo tenemos que hacer uso de la variable lectura y acceder al método que deseemos.

    Para acceder a los métodos de una clase, recordamos que se utiliza la nomenclatura del punto.

    Algunos métodos que podemos utilizar para la lectura de datos son los siguientes.

    • next(): Realiza una lectura hasta que encuentra el primer espacio.
    • nextInt(): Lee números enteros.
    • nextDouble(): Lee números decimales.
    • nextFloat(): Lee números decimales de tipo float.
    • nextLine(): Lee una linea completa de caracteres alfanuméricos.
    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.

    Por otro lado, se debe saber que, cuando un objeto se cierra, éste se destruye automáticamente. Por este motivo en java no existen destructores.

    Hasta aquí no hay ningún problema. Hemos aprendido a leer un dato y a almacenarlo en una variable en java. Vamos a ver ahora la diferencia que existe entre el método next() en java y el método nextLine().

    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«.

    ¿Fácil, verdad? ¡Pero esto no acaba aquí!

    Y aunque pensabas que lo habias visto todo, vamos a ver otro ejemplo en el que utilizaremos un objeto de tipo Scanner.

    En este ejemplo se pide los datos al usuario en este orden:

    • Primero, se pide el nombre al usuario. El dato, se leerá y se almacenará en una variable de tipo texto o String.
    • Después pediremos la edad. Al igual que el dato anterior, se leerá y se almacenará en otra variable de tipo número entero o int.
    • Mostramos una frase con el nombre del usuario y su edad contenido en ambas variables.
    • Finalizamos con un mensaje informando de que finalizó el programa con éxito.
    package arranque;
    /* Importamos todas las clases del 
     * paquete java.util.*/
    import java.util.*;
    public class ClasePrincipal {
    	public static void main(String[] args) {
    		
    		// Declaro un objeto lectura para leer los datos
    	    // introducidos por el usuario.
    	    Scanner lectura=new Scanner(System.in);
    	    // Variabla para almacenar el nombre
    	    String miNombre=""; 
    	    // Variabla para almacenar la edad
    	    int edad=0; // 
    	    // Pedimos el nombre al usuario
    	    System.out.println("Escribe tu nombre:");
    	    // Leemos el nombre y lo almacenamos en miNombre
    	    miNombre=lectura.nextLine();
    	    // Ahora pedimos su edad.
    	    System.out.println("Escribe tu edad");
    	    // Guardamos la edad.
    	    edad=lectura.nextInt();
    	    // Muestro un mensaje con el nombre y la edad
    	    System.out.println("Tu nombre es " + miNombre 
    	            + "y tu edad es " + edad + " años.");
    	    // Mostramos que finalizó el programa
    	    System.out.println("Programa finalizado con éxito."); 
    	    // Cerramos el objeto lectura para no consumir rescursos
    	    lectura.close();    
    	}	    
    }
    

    En este caso el programa estaría correcto y funcionando correctamente. Pero ¿qué pasaría si pedimos los datos en el orden contrario? En caso de pedir primero la edad y luego el nombre, debemos tener en cuenta que debemos limpiar el buffer del objeto Scanner. Esto lo veremos con más detalle en el siguiente artículo.