CodeGym/Blog Java/Random-ES/Clase de escáner Java
Autor
Milan Vucic
Programming Tutor at Codementor.io

Clase de escáner Java

Publicado en el grupo Random-ES
¡Hola! ¡Nuestra lección de hoy será especial! En la lección de hoy, hablaremos sobre Java Scanner Class. Anteriormente, el proceso de completar tareas y escribir programas era simple: escribimos un código, ejecutamos el main()método, el programa hace lo que se requiere, y hemos terminado. ¡Pero ahora todo cambiará! Hoy aprenderemos cómo interactuar realmente con el programa: ¡le enseñaremos cómo responder a nuestras acciones! Antes de comenzar a analizar el código, ¿alguna vez ha tenido que lidiar con un dispositivo como un escáner? Probablemente. El interior de un escáner es bastante complicado, pero la idea básica de su funcionamiento es muy simple: lee los datos que proporciona el usuario (como un pasaporte o una póliza de seguro) y almacena esta información en la memoria (por ejemplo, como una imagen ). ¡Hoy vas a crear tu propio escáner! Por supuesto, no podrá manejar documentos en papel, pero el texto no será un problema :) ¡Vamos!

Clase de escáner de Java

Clase de escáner - 1En primer lugar, debemos familiarizarnos con la clase java.util.Scanner . Su funcionamiento es muy simple. Como un escáner real, lee datos de una fuente que especifique. Por ejemplo, una cadena, un archivo, la consola. A continuación, reconoce la información y la procesa adecuadamente. Aquí está el ejemplo más simple:
public class Main {

   public static void main(String[] args) {

       Scanner scanner = new Scanner("It matters not how strait the gate,\n" +
               "How charged with punishments the scroll,\n" +
               "I am the master of my fate,\n" +
               "I am the captain of my soul");
       String s = scanner.nextLine();
       System.out.println(s);
   }
}
Creamos un objeto de escáner y especificamos su fuente de datos (una cadena de texto). El método nextLine() accede a la fuente de datos (nuestro texto con una cuarteta), encuentra la siguiente línea no leída (que es la primera línea en este caso) y la devuelve. Luego lo mostramos en la consola: Salida de la consola:
It matters not how strait the gate,
Podemos usar el método nextLine() varias veces y mostrar el extracto completo del poema:
public class Main {

   public static void main(String[] args) {

       Scanner scanner = new Scanner("It matters not how strait the gate,\n" +
               "How charged with punishments the scroll,\n" +
               "I am the master of my fate,\n" +
               "I am the captain of my soul");
       String s = scanner.nextLine();
       System.out.println(s);
       s = scanner.nextLine();
       System.out.println(s);
       s = scanner.nextLine();
       System.out.println(s);
       s = scanner.nextLine();
       System.out.println(s);
   }
}
Cada vez, nuestro escáner da un paso adelante y lee la siguiente línea. Se muestra la salida del programa:
It matters not how strait the gate,
How charged with punishments the scroll,
I am the master of my fate,
I am the captain of my soul
Como ya dijimos, la fuente de datos del escáner no tiene que ser una cadena. Por ejemplo, podría ser la consola. Algunas noticias emocionantes para usted: anteriormente, solo mostrábamos datos allí, ¡pero ahora leeremos datos desde el teclado! Veamos qué más hace la clase Scanner :
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter a number:");

       int number = sc.nextInt();

       System.out.println("Thanks! You entered the number " + number);

   }
}
El método nextInt() lee y devuelve el número ingresado. En nuestro programa, lo usamos para asignar un valor a la variable número . ¡Ya es más como un escáner real! El programa le pide al usuario que ingrese cualquier número. Después de que el usuario haya hecho esto, el programa agradece al usuario, muestra el resultado y finaliza. Pero todavía tenemos un problema serio. El usuario puede cometer un error e ingresar algo incorrecto. Aquí hay un ejemplo donde nuestro programa actual deja de funcionar:
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter a number:");

       int number = sc.nextInt();

       System.out.println("Thanks! You entered the number " + number);

   }
}
Intentemos ingresar la cadena "CodeGym" en lugar de un número: Salida de la consola:
Enter a number:
CodeGym
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:864)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextInt(Scanner.java:2117)
at java.util.Scanner.nextInt(Scanner.java:2076)
at Main.main(Main.java:10) Process finished with exit code 1
UH oh. Estamos en un gran problema -_- Para evitar tales situaciones, necesitamos encontrar una forma de verificar los datos ingresados ​​por el usuario. Por ejemplo, si el usuario ingresa algo que no sea un número, sería bueno mostrar una advertencia de que la información ingresada no es un número. Y si la información está bien, entonces podríamos confirmar. Pero esto requeriría que "miremos hacia el futuro" para ver lo que viene en nuestra corriente. ¿ Escáner puede hacer esto? ¡Y cómo! Y tiene una gran cantidad de métodos para hacer esto: hasNextInt() : este método verifica si el siguiente fragmento de datos de entrada es un número (devuelve verdadero o falso, según corresponda). hasNextLine() : este método comprueba si el siguiente fragmento de entrada es una cadena. tiene el siguiente byte() ,hasNextShort() , hasNextLong() , hasNextFloat() , hasNextDouble() — Todos estos métodos realizan verificaciones similares para los tipos de datos restantes. Intentemos cambiar nuestro programa de lectura de números:
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter a number:");

       if (sc.hasNextInt()) {
           int number = sc.nextInt();
           System.out.println("Thanks! You entered the number " + number);
       } else {
           System.out.println("Sorry, but this is clearly not a number. Restart the program and try again!");
       }

   }
}
Ahora nuestro programa verifica si el siguiente carácter ingresado es un número. Y muestra la confirmación solo si lo es. Si la entrada no pasa la verificación, el programa toma nota y le pide al usuario que vuelva a intentarlo. Básicamente, puede comunicarse con el objeto Scanner y averiguar de antemano qué tipo de datos le espera. ¿Un número, una cadena o algo más? ¿Un número? ¿Y de qué tipo? ¿An int , short , long ?" Esta flexibilidad le da la oportunidad de construir una lógica de programa que depende del comportamiento del usuario. Debemos tomar nota de otro método importante: useDelimiter() . Le pasa una cadena a este método. La cadena contiene el caracteres que desea utilizar como separadores o delimitadores. Por ejemplo, supongamos que de repente nos interesamos por la poesía japonesa y decidimos usar nuestro escáner para leer algunos haiku escritos por el gran poeta Matsuo Bashō. Incluso si se nos pasan tres versos diferentes como una cadena incómoda, podemos dividirlos fácilmente y reproducirlos maravillosamente:
public class Main {
   public static void main(String[] args) {
       Scanner scan = new Scanner("On a withered branch'" +
               "A crow has alighted.'" +
               "Nightfall in autumn." +
               "''***''" +
               "Such a moon above,'" +
               "Like a tree cut at the root:'" +
               "he fresh cut is white." +
               "''***''" +
               "How the river floods!'" +
               "A heron wanders on short legs,'" +
               "Knee-deep in the water.");

       scan.useDelimiter("'");

       while (scan.hasNext()) {
           System.out.println(scan.next());
       }

       scan.close();
   }
}
Usamos "\ n /*/*/*" (carácter de nueva línea y tres asteriscos) como nuestro delimitador. Como resultado, tenemos una hermosa salida de consola, como en los libros:
On a withered branch
A crow has alighted.
Nightfall in autumn.

***

Such a moon above,
Like a tree cut at the root:
The fresh cut is white.

***

How the river floods!
A heron wanders on short legs,
Knee-deep in the water.
Este ejemplo tiene un método más que debemos señalar absolutamente: close() . Como cualquier objeto que trabaje con flujos de E/S, el escáner debe cerrarse cuando termine para que deje de consumir los recursos de la computadora. ¡Nunca olvides el método close() !
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter a number:");

       int number = sc.nextInt();

       System.out.println("Thanks! You entered the number " + number);

       sc.close(); // Now we've done everything right!

   }
}
¡Eso es todo! Como puede ver, por lo útil que es, ¡la clase Scanner es bastante fácil de usar! :) Para reforzar lo que aprendió, le sugerimos que vea una lección en video de nuestro Curso de Java
Comentarios
  • Populares
  • Nuevas
  • Antiguas
Debes iniciar sesión para dejar un comentario
Esta página aún no tiene comentarios