JavaRush /Blog Java /Random-ES /Clase de escáner en Java

Clase de escáner en Java

Publicado en el grupo Random-ES
¡Hola! ¡Nuestra lección de hoy será especial! Antes de esto, al resolver problemas y escribir programas, el algoritmo era simple: escribimos un código, ejecutamos el método main() , el programa hace lo que se le pide y sale. ¡Pero ahora todo cambiará! Hoy aprenderemos cómo interactuar verdaderamente con el programa: ¡le enseñaremos a responder a nuestras acciones! Quizás ya entiendas hacia dónde vamos con esto. Dedicaremos esta conferencia a un análisis detallado de una de las clases del lenguaje Java: Scanner. Esta clase será útil si necesita leer los datos que ingresan los usuarios. Antes de pasar a aprender el código, dime, ¿alguna vez te has encontrado con un dispositivo como un escáner? Seguramente sí. La estructura interna del escáner es bastante compleja, pero la esencia de su trabajo es bastante simple: lee los datos que el usuario ingresa (por ejemplo, un pasaporte o una póliza de seguro) y almacena la información leída en la memoria (por ejemplo , en forma de imagen). ¡Así que hoy crearás tu propio escáner! Por supuesto, no puede manejar documentos, pero puede manejar bastante bien información de texto :) ¡Vamos!Clase de escáner - 1

Clase de escáner Java

Lo primero y más importante con lo que debemos familiarizarnos es la clase java.util.Scanner. Su funcionalidad es muy sencilla. Como un escáner real, lee datos de la fuente que usted le especifica. Por ejemplo, desde una línea, desde un archivo, desde la consola. Luego reconoce esta información y la procesa según sea necesario. Pongamos el ejemplo más sencillo:
public class Main {

   public static void main(String[] args) {

       Scanner scanner = new Scanner("Te amo, creación de Petra,\n" +
               "Me encanta tu mirada severa y esbelta,\n" +
               "Corriente soberana de Neva,\n" +
               "Granito costero");
       String s = scanner.nextLine();
       System.out.println(s);
   }
}
Creamos un objeto de escáner y le especificamos una fuente de datos (una cadena con texto). El método nextLine()accede a la fuente de datos (nuestro texto con cuartetas), encuentra allí la siguiente línea que aún no ha leído (en nuestro caso, la primera) y la devuelve. Después de lo cual lo enviamos a la consola: Salida de la consola:

Люблю тебя, Pedroа творенье,
Podemos usar el método nextLine()varias veces y generar la pieza completa del poema:
public class Main {

   public static void main(String[] args) {

       Scanner scanner = new Scanner("Te amo, creación de Petra,\n" +
               "Me encanta tu mirada severa y esbelta,\n" +
               "Corriente soberana de Neva,\n" +
               "Granito costero");
       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 dará un paso adelante y leerá la siguiente línea. El resultado del programa se envía a la consola:

Люблю тебя, Pedroа творенье,
Люблю твой строгий, стройный вид,
Невы державное теченье,
Береговой ее гранит
Como ya dijimos, la fuente de datos para el escáner puede ser no solo una cadena, sino también, por ejemplo, una consola. Noticias importantes para nosotros: si antes solo escribíamos datos allí, ¡ahora ingresaremos datos desde el teclado! Veamos qué más puede hacer la clase Scanner :
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Ingrese el número:");

       int number = sc.nextInt();

       System.out.println("¡Gracias! Ingresaste un número" + number);

   }
}
El método nextInt()lee y devuelve el número ingresado. En nuestro programa, se utiliza para asignar un valor a una variable number. ¡Esto se parece más a un escáner real! El programa pide al usuario que ingrese cualquier número en una línea. Una vez que el usuario ha hecho esto, el programa le agradece, muestra el resultado de su trabajo en la consola y finaliza. Pero todavía tenemos un problema grave. El usuario puede cometer un error e ingresar algo incorrecto. A continuación se muestra un ejemplo de cuándo nuestro programa actual dejaría de funcionar:
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Ingrese el número:");

       int number = sc.nextInt();

       System.out.println("¡Gracias! Ingresaste un número" + number);

   }
}
Intentemos ingresar la cadena "JavaRush" en lugar de un número: Salida de la consola:
Introduce el número:
JavaRush
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
Vaya, todo está mal -_- Para evitar este tipo de situaciones, debemos encontrar una manera de validar los datos que ingresa el usuario. Por ejemplo, el usuario ingresa algo más que un número, sería bueno mostrar una advertencia en la consola de que la información ingresada no es un número y, si todo está en orden, mostrar un texto de confirmación. Pero para hacer esto, en realidad necesitamos "mirar hacia el futuro": descubrir qué sigue en nuestro flujo. ¿Puede Scanner en Java hacer esto? ¡Cómo puede! Y para ello dispone de todo un grupo de métodos: hasNextInt()- el método comprueba si la siguiente parte de los datos introducidos es un número o no (devuelve verdadero o falso, respectivamente). hasNextLine()— comprueba si el siguiente dato es una cadena. hasNextByte(), hasNextShort(), hasNextLong(), hasNextFloat(), hasNextDouble()- todos estos métodos hacen lo mismo para otros tipos de datos. Intentemos cambiar nuestro programa para leer números:
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Ingrese el número:");

       if (sc.hasNextInt()) {
           int number = sc.nextInt();
           System.out.println("¡Gracias! Ingresaste un número" + number);
       } else {
           System.out.println("Lo siento, pero claramente esto no es un número. ¡Reinicia el programa e inténtalo de nuevo!");
       }

   }
}
Ahora nuestro programa comprueba si el siguiente carácter introducido es un número o no. Y sólo si es así, muestra una confirmación. Si la entrada no pasa la prueba, el programa lo nota y le pide que vuelva a intentarlo. Básicamente, puede comunicarse con el objeto Scanner y saber de antemano qué tipo de datos esperar. “Oye, escáner, ¿qué sigue? ¿Número, cadena o algo más? ¿Número? ¿ Y cuál int... short? longEsta flexibilidad le brinda la oportunidad de construir la lógica de su programa dependiendo del comportamiento del usuario. Otro método importante al que vale la pena prestarle atención es useDelimiter(). A este método se le pasa la cadena que desea utilizar como delimitador. Por ejemplo, de repente nos interesamos por la poesía japonesa y decidimos utilizar el escáner para leer varios haiku del gran poeta Matsuo Basho. Incluso si se nos dan tres versículos diferentes en una línea torpe, podemos separarlos fácilmente y darles un formato agradable:
public class Main {
   public static void main(String[] args) {
       Scanner scan = new Scanner("Sobre una rama desnuda" +
               "Raven se sienta solo". +
               "Tarde de otoño." +
               "''***''" +
               "Hay tal luna en el cielo", +
               "Como un árbol cortado de raíz:'" +
               "Un corte fresco se vuelve blanco". +
               "''***''" +
               "¡Cómo se ha desbordado el río!" +
               "La garza deambula con patas cortas" +
               "Hasta las rodillas en el agua".);

       scan.useDelimiter("'");

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

       scan.close();
   }
}
Usamos el método useDelimeter() de la clase Scanner como separador de líneas : se encarga de dividir los datos entrantes en partes. En nuestro caso, se pasa una comilla simple ( "'" ) como argumento y se usa para separar cadenas . El texto que sigue a esta cita aparece en una nueva línea porque en el bucle while estamos usando el método println() de la clase System para leer los datos. Como resultado, tendremos un hermoso resultado en la consola, como en los libros:
На голой ветке
Ворон сидит одиноко.
Осенний вечер.

*** 
 
В небе такая луна,
Словно дерево спилено под корень:
Белеет свежий срез.

*** 
 
Как разлилась река!
Цапля бредет на коротких ножках,
По колено в воде.
En el mismo ejemplo, hay un método más al que definitivamente debes prestar atención: close(). Como cualquier objeto que trabaja con flujos de E/S, el escáner debe cerrarse cuando finaliza su trabajo para que ya no consuma recursos de nuestro ordenador. ¡Nunca olvides el método close()!
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Ingrese el número:");

       int number = sc.nextInt();

       System.out.println("¡Gracias! Ingresaste un número" + number);

       sc.close();//¡Ahora hicimos todo bien!

   }
}
¡Eso es todo! Como puede ver, la clase Scanner es bastante fácil de usar y muy útil. :)
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION