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.out
objeto 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.in
objeto, 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. Scanner
clase
La Scanner
clase (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.in
objeto 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 Scanner
objeto se vería así:
Código | Explicación |
---|---|
|
Creamos un Scanner objeto. 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 Scanner
clase:
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 Scanner
objeto
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";
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);
Todo lo que queda a la izquierda del signo igual es la declaración de una variable llamada console
cuyo tipo es Scanner
. En su lugar, podría llamarlo s
o scanner
o 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 new
palabra clave) cuyo tipo sea Scanner
, pasando el System.in
objeto como fuente de datos para el Scanner
objeto recién creado.
Después de ejecutar toda esta línea, tendremos una Scanner
variable con nombre console
que nuestro programa usará para leer datos del teclado.
4. Lista de métodos
En el ejemplo anterior, nuestra Scanner
console
variable almacena una referencia a un Scanner
objeto.
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);
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();
Ejemplo:
System.out.println();
5. Entrada de consola
Cuando tenemos un Scanner
objeto, 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 number
variable.
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 double
nú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);
}
}
El usuario puede ingresar varios números en una sola línea, separándolos con espacios: los métodos de la Scanner
clase 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 Scanner
clase
Por cierto, los métodos anteriores no son todo lo que la Scanner
clase tiene para ofrecer. La lista completa de métodos se parece a esto:
Método | Descripción |
---|---|
|
Lee datos y los convierte en unbyte |
|
Lee datos y los convierte en unshort |
|
Lee datos y los convierte en unint |
|
Lee datos y los convierte en unlong |
|
Lee datos y los convierte en unfloat |
|
Lee datos y los convierte en undouble |
|
Lee datos y los convierte en unboolean |
|
Lee una "ficha". Los tokens están separados por espacios o presiones de la tecla enter |
|
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 |
---|---|
|
¿Hay un byte ? ¿Se puede convertir la entrada a un byte ? |
|
¿Hay un short ? ¿Se puede convertir la entrada a un short ? |
|
¿Hay un int ? ¿Se puede convertir la entrada a un int ? |
|
¿Hay un long ? ¿Se puede convertir la entrada a un long ? |
|
¿Hay un float ? ¿Se puede convertir la entrada a un float ? |
|
¿Hay un double ? ¿Se puede convertir la entrada a un double ? |
|
¿Hay un boolean ? ¿Se puede convertir la entrada a un boolean ? |
|
¿Hay otra ficha? |
|
¿Hay otra línea? |
7. Lectura de datos de una cadena
Anteriormente mencionamos que la Scanner
clase 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 Scanner
objeto, pasamos la cadena str
en lugar del System.in
objeto. Y ahora el scanner
objeto leerá datos de la cadena. Ejemplo:
Código de programa: | Explicación: |
---|---|
|
// un == 10;
// b == 20;
La salida de pantalla será: |