Qué es y cómo usar la clase Scanner en Java

Puede sonar a cosa de mundo viejuno, pero hasta la versión Java 1.5 algo tan sencillo como capturar la entrada de datos procedente del usuario en un programa escrito en Java no era una tarea fácil. Por suerte a partir de esa versión contamos con una nueva clase, llamada Scanner, que simplificó y mucho la tarea de obtener información introducida por el usuario para ser procesada por nuestro programa. Y aunque ha llovido ya mucho desde entonces, la última versión estable de Java es la 15.0.1 presentada en octubre del pasado año, la clase Scanner ha mantenido su vigencia.

Dentro del paquete java.util, Scanner es una clase que nos permite obtener la entrada de datos primitivos. Esto quiere decir que podemos capturar datos del tipo int, double, string y etc. Esta clase nos permite de una manera fácil componer nuestro programa para que entienda los datos que introduce un usuario, por ejemplo en un formulario, y aunque no es “muy eficiente” si necesitamos un método de entrada para escenarios donde el tiempo sea una restricción, en los escenarios más generales resulta perfecto.

Cómo importar la clase Scanner en Java

En este artículo vamos a ver un sencillo ejemplo de cómo usar la clase Scanner pero antes debemos importarla. Para declarar esto debemos añadir la siguiente línea al comienzo de nuestro programa:

import java.util.Scanner;

Tenemos que tener en cuenta que la clase Scanner debe ser declarada tal cual con la primera letra en mayúscula. Podemos pensar que import java.util.*; también resuelve esto, pero lo que hacemos con el primer método es solo cargar la clase Scanner y no todas las demás disponibles. Recuerda, la memoria lo es todo. ;)

Declarar y crear un objeto Scanner en Java

El siguiente paso para poder utilizar la clase Scanner es crear la variable Scanner como una variable de clase y crear el objeto Scanner como se muestra el la siguiente línea:

static Scanner sc = new Scanner(System.in);

De este modo para crear un objeto Scanner, usaremos la nueva palabra clave seguida de una llamada al constructor de la clase Scanner. Lo que tenemos que tener en cuenta es que necesitamos introducir un parámetro que indique de dónde procederán la fuente de datos. En nuestro ejemplo usaré System.in para especificar la entrada de consola de teclado estándar aunque podemos pasar un objeto de clase File si queremos leer la entrada de un archivo. De este modo podemos manejar la clase al usar el objeto sc para manejar y almacenar los datos introducidos por el usuario.



Método

Explicación

boolean nextBoolean()

Lee valores lógicos boléanos introducidos por el usuario.

byte nextByte()

Lee valores byte introducidos por el usuario.

double nextDouble()

Lee valores double introducidos por el usuario.

float nextFloat()

Lee valores float introducidos por el usuario.

int nextInt()

Lee valores int introducidos por el usuario.

String nextLine()

Lee valores String introducidos por el usuario.

long nextLong()

Lee valores long introducidos por el usuario.

short nextShort()

Lee valores short introducidos por el usuario.

Ejemplo:


// Programa Java para leer datos de varios tipos usando la clase Scanner

import java.util.Scanner;

public class ScannerDemo
{
    public static void main(String[] args)
    {
        // Declarar el objeto e inicializar con
        // el objeto de entrada estándar predefinido

        Scanner sc = new Scanner(System.in);

        // entrada de una cadena
        String name = sc.nextLine();

        // entrada de un carácter
        char gender = sc.next().charAt(0);

        // Entrada de datos numéricos
        // byte, short y float
        int age = sc.nextInt();
        long mobileNo = sc.nextLong();
        double average = sc.nextDouble();

        // Imprima los valores para verificar si la entrada
        // fue obtenida correctamente.
        System.out.println("Nombre: "+name);
        System.out.println("Género: "+gender);
        System.out.println("Edad: "+age);
        System.out.println("Teléfono: "+mobileNo);
        System.out.println("Promedio: "+average);
    }
}

 



Entrada:

 

Alex

masculino

23

92578458

20

Salida:

 

Nombre: Alex

Género: m

Edad: 23

Teléfono: 92578458

Promedio: 20.0

En este ejemplo vemos como los datos introducidos tienen su salida correspondiente. Cada uno de los métodos termina con un paréntesis vacío. Esto viene a significar que estos métodos no requieren parámetros, de ser así se enumeran entre estos paréntesis.

Así el método nextInt devuelve un valor int. Pero ¿qué ocurre si introducimos un tipo de datos no esperado? Pues que obtendremos un error, como por ejemplo:

Enter an integer: three Exception in thread “main” java.util.InputMismatchException

at java.util.Scanner.throwFor(Scanner.java:819)

at java.util.Scanner.next(Scanner.java:1431)

at java.util.Scanner.nextInt(Scanner.java:2040)

at java.util.Scanner.nextInt(Scanner.java:2000)

at ScannerApp.main(ScannerApp.java:11)

Aquí InputMismatchException es claro y no requiere mayor explicación. No hemos hecho las cosas bien y nuestro programa necesita ser depurado. En este tipo de situaciones debemos verificar si el valor que leemos corresponde al tipo de datos esperado por la clase Scanner. Para eso nos ayudaremos de la función .hasNextXYZ() en donde XYZ es el tipo de datos que nos interesa. Esta función devolverá verdadero (true) o falso (false) según corresponda.

 



Método

Explicación

hasNextBoolean()

Devuelve true si el siguiente valor es introducido es un booleano.

hasNextByte()

Devuelve true si el siguiente valor es introducido es un valor byte.

hasNextDouble()

Devuelve true si el siguiente valor es introducido es un valor double.

hasNextFloat()

Devuelve true si el siguiente valor es introducido es un valor float.

hasNextInt()

Devuelve true si el siguiente valor es introducido es un valor int.

hasNextLong()

Devuelve true si el siguiente valor es introducido es un valor long.

boolean hasNextShort()

Returns true if the next value entered by the user is a valid short value.

Dicho esto, echemos un vistazo al siguiente de código de ejemplo para leer algunos números de la consola e imprimir su resultado:

Ejemplo:

// Programa Java para leer algunos valores usando la clase Scanner
// e imprimir su media
import java.util.Scanner;
public class ScannerDemo2
{
    public static void main(String[] args)
    {
        // Declarar un objeto e inicializar con
        // el objeto de entrada estándar predefinido
        Scanner sc = new Scanner(System.in);
        // Inicializar la suma y el recuento
        // de los elementos de entrada
        int sum = 0, count = 0;
        // Compruebe si un valor int está disponible
        while (sc.hasNextInt())
        {
            // Lee un valor int
            int num = sc.nextInt();
            sum += num;
            count++;
        }
        int mean = sum / count;
        System.out.println("La media es: " + mean);
    }
}

 



Entrada:

 

1

2

3

4

5

6.0

Salida:

 

La media es: 3

Y hasta aquí por el momento. En próximos artículos iremos profundizando un poco más en conceptos básicos que nos ayudarán a manejar los conceptos básicos de la programación orientada a objetos en Java, como el manejo de estructuras condicionales, bucles y manejo de excepciones, antes de entrar en conceptos más avanzados.

Puede que te preguntes cuál es el siguiente paso mientras el siguiente artículo no llega. Pues cómo diría el señor Miyagi ahora es el momento de “poner y quitar cera” o dicho de otro modo practicar lo aquí aprendido para mejorar nuestro karate. ;)

 

Guía de Posibilidades Profesionales en el Ecosistema de Java

 

Tags