Clase Scanner de Java

java.util.Scanner es una nueva característica de Java 5. Podemos usar la clase Scanner para obtener la entrada del usuario.

La siguiente es la sintaxis básica para crear un objeto Scanner:

Scanner s = new Scanner(System.in);

A continuación, demostramos una entrada de datos muy simple y obtenemos la cadena de entrada mediante los métodos next() y nextLine() de la clase Scanner. Antes de leer, generalmente necesitamos usar hasNext y hasNextLine para determinar si todavía hay datos de entrada:

Usando el método next:

Código del archivo ScannerDemo.java:

import java.util.Scanner; public class ScannerDemo { public static void main(String[] args) { Scanner scan = new Scanner(System.in); //Recibir datos desde el teclado //Método next para recibir cadenas System.out.println("Recepción con next:"); //Determinar si hay más entrada if (scan.hasNext()) { String str1 = scan.next(); System.out.println("Los datos ingresados son:" + str1); } scan.close(); } }

El resultado de ejecutar el programa anterior es:

$ javac ScannerDemo.java
$ java ScannerDemo
next方式接收:
ejemplo com
输入的数据为:ejemplo

Se puede ver que la cadena 'com' no se muestra. A continuación veamos nextLine.

Usando el método nextLine:

Código del archivo ScannerDemo.java:

import java.util.Scanner; public class ScannerDemo { public static void main(String[] args) { Scanner scan = new Scanner(System.in); //Recibir datos desde el teclado //Método nextLine para recibir cadenas System.out.println("Recepción con nextLine:"); //Determinar si hay más entrada if (scan.hasNextLine()) { String str2 = scan.nextLine(); System.out.println("Los datos ingresados son:" + str2); } scan.close(); } }

El resultado de ejecutar el programa anterior es:

$ javac ScannerDemo.java
$ java ScannerDemo
nextLine方式接收:
ejemplo com
输入的数据为:ejemplo com

Se puede ver que la cadena 'com' se muestra.

Diferencia entre next() y nextLine()

next():

  • 1. Debe leer un carácter válido antes de poder terminar la entrada.
  • 2. El método next() elimina automáticamente los espacios en blanco encontrados antes de un carácter válido.
  • 3. Solo después de ingresar un carácter válido, los espacios en blanco posteriores se utilizan como separadores o terminadores.
  • next() no puede obtener cadenas con espacios.

nextLine():

  • 1. Usa Enter como terminador, es decir, el método nextLine() devuelve todos los caracteres antes de ingresar Enter.
  • 2. Puede obtener espacios en blanco.

Si desea ingresar datos de tipo int o float, la clase Scanner también los admite, pero antes de ingresar es mejor usar el método hasNextXxx() para verificar y luego usar nextXxx() para leer:

Código del archivo ScannerDemo.java:

import java.util.Scanner; public class ScannerDemo { public static void main(String[] args) { Scanner scan = new Scanner(System.in); //Recibir datos desde el teclado int i = 0; float f = 0.0f; System.out.print("Ingrese un entero:"); if (scan.hasNextInt()) { //Determinar si la entrada es un entero i = scan.nextInt(); //Recibir entero System.out.println("Datos enteros:" + i); } else { //Mensaje de entrada incorrecta System.out.println("¡Lo ingresado no es un entero!"); } System.out.print("Ingrese un decimal:"); if (scan.hasNextFloat()) { //Determinar si la entrada es un decimal f = scan.nextFloat(); //Recibir decimal System.out.println("Datos decimales:" + f); } else { //Mensaje de entrada incorrecta System.out.println("¡Lo ingresado no es un decimal!"); } scan.close(); } }

El resultado de ejecutar el programa anterior es:

$ javac ScannerDemo.java
$ java ScannerDemo
输入整数:12
整数数据:12
输入小数:1.2
小数数据:1.2

En el siguiente ejemplo, podemos ingresar varios números y calcular su suma y promedio. Cada número se confirma con Enter. Al ingresar algo que no sea un número, se finaliza la entrada y se muestra el resultado:

Código del archivo ScannerDemo.java:

import java.util.Scanner; class EjemploTest { public static void main(String[] args) { System.out.println("Ingrese un número:"); Scanner scan = new Scanner(System.in); double sum = 0; int m = 0; while (scan.hasNextDouble()) { double x = scan.nextDouble(); m = m + 1; sum = sum + x; } System.out.println(m + "La suma de los números es" + sum); System.out.println(m + "El promedio de los números es" + (sum / m)); scan.close(); } }

El resultado de ejecutar el programa anterior es (ingrese un no número para finalizar la entrada):

$ javac ScannerDemo.java
$ java ScannerDemo
请输入数字:
12
23
15
21.4
end
4个数的和为71.4
4个数的平均值是17.85

Métodos comunes

Método Descripción
Constructores
Scanner(File source) Crear Scanner desde un archivo
Scanner(InputStream source) Crear Scanner desde un flujo de entrada
Scanner(String source) Crear Scanner desde una cadena
Métodos básicos de entrada
boolean hasNext() Comprueba si hay un siguiente token (separado por espacios)
String next() Lee el siguiente token (cadena)
boolean hasNextLine() Comprueba si hay una siguiente línea
String nextLine() Lee el contenido de la siguiente línea
Métodos de verificación de tipos
boolean hasNextInt() Comprueba si el siguiente token es un entero
boolean hasNextDouble() Comprueba si el siguiente token es un número de coma flotante de doble precisión
boolean hasNextBoolean() Comprueba si el siguiente token es un valor booleano
Métodos de lectura de tipos
int nextInt() Lee el siguiente entero
double nextDouble() Lee el siguiente número de coma flotante de doble precisión
boolean nextBoolean() Lee el siguiente valor booleano
long nextLong() Lee el siguiente entero largo
float nextFloat() Lee el siguiente número de coma flotante de precisión simple
short nextShort() Lee el siguiente entero corto
byte nextByte() Lee el siguiente byte
Control de delimitadores
Scanner useDelimiter(String pattern) Establecer el patrón de delimitador
Scanner useDelimiter(Pattern pattern) Establecer el delimitador usando expresiones regulares
String delimiter() Devuelve el patrón de delimitador actual
Otros métodos
void close() Cerrar el escáner
Scanner skip(Pattern pattern) Omite la entrada que coincide con el patrón especificado
Scanner skip(String pattern) Omite la entrada que coincide con la cadena especificada
String findInLine(Pattern pattern) Busca el patrón especificado en la línea actual
String findInLine(String pattern) Busca la cadena especificada en la línea actual
Scanner reset() Restablecer el escáner
Locale locale() Devuelve la configuración regional actual del escáner
Scanner useLocale(Locale locale) Establece la configuración regional del escáner

Para más contenido, consulte la documentación de la API:https://www.example.com/manual/jdk11api/java.base/java/util/Scanner.html。

Otras extensiones