1. Lectura desde la consola usandoSystem.in

En las lecciones anteriores, nos familiarizamos con los comandos para mostrar información en la pantalla. Para ello, hemos utilizado el System.outobjeto y sus print()métodos println(). Es simple y conveniente.

Pero, como ya habrás adivinado, mostrar información en pantalla no es suficiente para nosotros. El propósito de la mayoría de los programas es hacer algo útil para el usuario. Eso significa que muy a menudo es necesario que el usuario pueda ingresar datos desde el teclado.

Al igual que en el caso de la salida, también tenemos un objeto especial para la entrada de datos: System.in. Pero, por desgracia para nosotros, no es tan cómodo como nos gustaría. Nos permite leer datos del teclado un carácter a la vez.

Para mejorar esto, usaremos otra clase que, cuando se empareja con el System.inobjeto, nos dará todo lo que necesitamos. Desde hace mucho tiempo, Java ha tenido clases para adaptarse a cada ocasión. Y conoceremos a uno de ellos ahora.


2. Scannerclase

La Scannerclase (nombre completo: java.util.Scanner) puede leer datos de diferentes fuentes, por ejemplo, la consola, archivos e Internet. Si queremos que lea datos del teclado, debemos pasar el System.inobjeto como un argumento que servirá como fuente de datos. Y luego el objeto Scanner descubrirá qué hacer con él.

Leer desde el teclado usando un Scannerobjeto se vería así:

Código Explicación
Scanner console = new Scanner(System.in);
String name = console.nextLine();
int age = console.nextInt();
Creamos un Scannerobjeto.
Leemos una línea de texto desde el teclado.
Leemos un número del teclado.

Parece fácil, pero ¿realmente es así de simple?

Creo que debe tener un montón de preguntas, y ahora las responderemos.

Pero primero, demostremos un ejemplo de un programa completo que usa la Scannerclase:

import java.util.Scanner;
public class Solution {
   public static void main(String[] args)
   {
      Scanner console = new Scanner(System.in);
      String name = console.nextLine();
      int age = console.nextInt();

      System.out.println("Name: " + name);
      System.out.println("Age: " + age);
   }
}

3. Crear un Scannerobjeto

La primera pregunta es ¿qué es esta línea Scanner console = new Scanner (System.in);?

Esta línea puede ser confusa, pero verá cosas similares todo el tiempo. Así que creemos que es importante explicar lo que está pasando aquí.

Recuerde cómo solemos crear una variable con texto:

String str = "text";
Declarar e inicializar una variable de cadena

Primero escribimos el tipo de variable ( String), luego su nombre ( str), y finalmente, después del signo igual, escribimos el valor.

Nuestra línea desconcertante es en realidad la misma:

Scanner console = new Scanner(System.in);
Declarar e inicializar una Scannervariable

Todo lo que queda a la izquierda del signo igual es la declaración de una variable llamada consolecuyo tipo es Scanner. En su lugar, podría llamarlo s o scannero incluso keyboard. Entonces el código quedaría así:

Scanner s = new Scanner(System.in);
String name = s.nextLine();
int age = s.nextInt();
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int age = scanner.nextInt();
Scanner keyboard = new Scanner(System.in);
String name = keyboard.nextLine();
int age = keyboard.nextInt();

Creo que eso deja todo mucho más claro.

Pero el código a la derecha del signo igual es un poco más complicado. Ahora me refiero a new Scanner(System.in); Dicho esto, aquí tampoco sucede nada sobrenatural.

En este código, le decimos a la máquina Java: cree un nuevo objeto (la newpalabra clave) cuyo tipo sea Scanner , pasando el System.inobjeto como fuente de datos para el Scannerobjeto recién creado.

Después de ejecutar toda esta línea, tendremos una Scannervariable con nombre console que nuestro programa usará para leer datos del teclado.


4. Lista de métodos

En el ejemplo anterior, nuestra Scanner consolevariable almacena una referencia a un Scannerobjeto.

Para llamar a métodos en un objeto al que hace referencia una variable, escribe un punto después del nombre de la variable, seguido del nombre del método y cualquier argumento. La apariencia general del comando es la siguiente:

variable.method(arguments);
Llamar a un método en un objeto al que hace referencia una variable

Ejemplos:

System.out.println("Hello");
System.out.println(1);

Si no planea pasar argumentos a una función, simplemente escriba paréntesis vacíos:

variable.method();
Llamar a un método sin pasar argumentos

Ejemplo:

System.out.println();

5. Entrada de consola

Cuando tenemos un Scannerobjeto, es fácil obtener datos del teclado.

Para leer una línea desde el teclado , necesita este comando:

String str = console.nextLine();

Cuando la ejecución del programa llegue a esta línea, se detendrá y esperará a que el usuario ingrese los datos y presione enter. Luego, todo lo que el usuario ingresó se almacena en la variable str.

Para leer un número desde el teclado , necesita este comando:

int number = console.nextInt();

Todo aquí es como el comando anterior. Cuando la ejecución del programa llegue a esta línea, se detendrá y esperará a que el usuario ingrese los datos y presione enter. Después de eso, todo lo que el usuario ingresó se convierte en un número y se almacena en la numbervariable.

Si el usuario ingresó datos que no se pueden convertir a un número entero, el programa generará un error y saldrá.

Para leer un número fraccionario desde el teclado , necesita este comando:

double number = console.nextDouble();

Esta declaración es muy similar a la del nextInt()método, solo que verifica que los datos ingresados ​​​​se puedan convertir a un doublenúmero.

Ejemplo de un programa que lee dos números del teclado y muestra su suma en la pantalla:

import java.util.Scanner;
public class Solution {
   public static void main(String[] args)
   {
      Scanner console = new Scanner(System.in);
      int a = console.nextInt();
      int b = console.nextInt();

      System.out.println(a + b);
   }
}
Nota

El usuario puede ingresar varios números en una sola línea, separándolos con espacios: los métodos de la Scannerclase saben cómo manejar esto. Dicho esto, el programa lee los números solo después de que el usuario presiona Enter.



6. Otros métodos de la Scannerclase

Por cierto, los métodos anteriores no son todo lo que la Scannerclase tiene para ofrecer. La lista completa de métodos se parece a esto:

Método Descripción
nextByte()
Lee datos y los convierte en unbyte
nextShort()
Lee datos y los convierte en unshort
nextInt()
Lee datos y los convierte en unint
nextLong()
Lee datos y los convierte en unlong
nextFloat()
Lee datos y los convierte en unfloat
nextDouble()
Lee datos y los convierte en undouble
nextBoolean()
Lee datos y los convierte en unboolean
next()
Lee una "ficha". Los tokens están separados por espacios o presiones de la tecla enter
nextLine()
Lee una línea completa

También hay métodos que le permiten verificar el siguiente token en la entrada sin realmente buscarlo (para saber qué método usar para leerlo).

Método Descripción
hasNextByte()
¿Hay un byte? ¿Se puede convertir la entrada a un byte?
hasNextShort()
¿Hay un short? ¿Se puede convertir la entrada a un short?
hasNextInt()
¿Hay un int? ¿Se puede convertir la entrada a un int?
hasNextLong()
¿Hay un long? ¿Se puede convertir la entrada a un long?
hasNextFloat()
¿Hay un float? ¿Se puede convertir la entrada a un float?
hasNextDouble()
¿Hay un double? ¿Se puede convertir la entrada a un double?
hasNextBoolean()
¿Hay un boolean? ¿Se puede convertir la entrada a un boolean?
hasNext()
¿Hay otra ficha?
hasNextLine()
¿Hay otra línea?

7. Lectura de datos de una cadena

Anteriormente mencionamos que la Scannerclase puede leer datos de varias fuentes. Una de esas fuentes es una cadena de texto .

Se ve algo como esto:

String str = "text";
Scanner scanner = new Scanner(str);

Al crear el Scannerobjeto, pasamos la cadena stren lugar del System.inobjeto. Y ahora el scannerobjeto leerá datos de la cadena. Ejemplo:

Código de programa: Explicación:
import java.util.Scanner;
public class Solution {
   public static void main(String[] args)
   {
      String str = "10 20 40 60";
      Scanner scanner = new Scanner(str);
      int a = scanner.nextInt();
      int b = scanner.nextInt();

      System.out.println(a + b);
   }
}


// un == 10; 
// b == 20; 
La salida de pantalla será:30