BufferedReader vs Console vs Scanner en Java

1. Información general

En este artículo, veremos las diferencias entre las clases BufferedReader , Console y Scanner en Java .

Para profundizar en cada tema, le sugerimos que eche un vistazo a nuestros artículos individuales sobre Java Scanner, E / S de consola en Java y BufferedReader.

2. Entrada del usuario

Dada la secuencia subyacente que se pasa a los constructores, las clases BufferedReader y Scanner pueden manejar una gama más amplia de entradas del usuario , como una cadena, un archivo, una consola del sistema (que normalmente está conectada al teclado) y un socket.

Por otro lado, la clase Console está diseñada para acceder solo a la consola del sistema basada en caracteres, si la hubiera, asociada con la máquina virtual Java actual.

Echemos un vistazo a los constructores BufferedReader , que aceptan diferentes entradas:

BufferedReader br = new BufferedReader( new StringReader("Bufferedreader vs Console vs Scanner in Java")); BufferedReader br = new BufferedReader( new FileReader("file.txt")); BufferedReader br = new BufferedReader( new InputStreamReader(System.in)) Socket socket = new Socket(hostName, portNumber); BufferedReader br = new BufferedReader( new InputStreamReader(socket.getInputStream())); 

La clase Scanner también podría aceptar diferentes entradas en sus constructores:

Scanner sc = new Scanner("Bufferedreader vs Console vs Scanner in Java") Scanner sc = new Scanner(new File("file.txt")); Scanner sc = new Scanner(System.in); Socket socket = new Socket(hostName, portNumber); Scanner sc = new Scanner(socket.getInputStream());

La clase Console está disponible solo a través de la llamada al método:

Console console = System.console();

Tenga en cuenta que cuando usamos la clase Console , la consola del sistema asociada a JVM no está disponible si ejecutamos el código dentro de un IDE como Eclipse o IntelliJ IDEA.

3. Salida del usuario

A diferencia de las clases BufferedReader y Scanner , que no escriben nada en el flujo de salida, la clase Console ofrece algunos métodos convenientes como readPassword (String fmt, Object ... args), readLine (String fmt, Object ... args) y printf ( Formato de cadena, Objeto ... args) , para escribir el mensaje en el flujo de salida de la consola del sistema :

String firstName = console.readLine("Enter your first name please: "); console.printf("Welcome " + firstName );

Entonces, cuando escribimos un programa para interactuar con la consola del sistema, la clase Console simplificará el código eliminando System.out.println innecesario .

4. Entrada de análisis

La clase Scanner puede analizar cadenas y tipos primitivos mediante expresiones regulares .

Divide su entrada en tokens utilizando un patrón delimitador personalizado, que de forma predeterminada coincide con los espacios en blanco:

String input = "Bufferedreader vs Console vs Scanner"; Scanner sc = new Scanner(input).useDelimiter("\\s*vs\\s*"); System.out.println(sc.next()); System.out.println(sc.next()); System.out.println(sc.next()); sc.close();

Las clases BufferredReader y Console simplemente leen el flujo de entrada tal como está.

5. Leer datos seguros

La clase Console tiene métodos readPassword () y readPassword (String fmt , Object ... args) para leer los datos seguros con el eco desactivado para que los usuarios no vean lo que están escribiendo:

String password = String.valueOf(console.readPassword("Password :")); 

BufferedReader y Scanner no tienen capacidad para hacerlo.

6. Seguro para subprocesos

Los métodos de lectura en BufferedReader y los métodos de lectura y escritura en Console están todos sincronizados , mientras que los de la clase Scanner no lo están. Si leemos la entrada del usuario en un programa multiproceso, BufferedReader o Console será una mejor opción.

7. Tamaño del búfer

El tamaño del búfer es de 8 KB en BufferedReader en comparación con 1 KB en la clase Scanner .

Además, podemos especificar el tamaño del búfer en el constructor de la clase BufferedReader si es necesario. Esto ayudará al leer las cadenas largas de la entrada del usuario. La clase de consola no tiene búfer cuando lee desde la consola del sistema , pero tiene un flujo de salida almacenado en búfer para escribir en la consola del sistema.

8. Varios

Hay algunas diferencias que no son los factores principales que consideramos al elegir la clase adecuada para usar en diversas situaciones.

8.1. Cerrar el flujo de entrada

Una vez que creamos la instancia de BufferedReader o Scanner , debemos recordar cerrarla para evitar una pérdida de memoria . Pero esto no sucede con la clase Console , no es necesario cerrar la consola del sistema después de su uso.

8.2. Manejo de excepciones

Mientras que Scanner y Console van con el enfoque de excepción sin marcar, los métodos en BufferedReader arrojan excepciones marcadas, lo que nos obliga a escribir una sintaxis repetitiva de try-catch para manejar las excepciones.

9. Conclusión

Ahora que hemos establecido las diferencias entre estas clases, propongamos algunas reglas generales con respecto a cuáles son las más adecuadas para abordar diferentes situaciones :

  • Use BufferedReader si necesitamos leer cadenas largas de un archivo, ya que tiene un mejor rendimiento que Scanner
  • Considere Console si estamos leyendo datos seguros de la consola del sistema y queremos ocultar lo que se está escribiendo
  • Use Scanner si necesitamos analizar el flujo de entrada con una expresión regular personalizada
  • Se preferiría el escáner cuando interactuamos con la consola del sistema, ya que ofrece métodos detallados para leer y analizar el flujo de entrada. Además, el inconveniente de rendimiento no es un gran problema, ya que en la mayoría de los casos, los métodos nextXXX se bloquean y esperan la entrada manual.
  • En un contexto seguro para subprocesos, considere BufferedReader a menos que tengamos que usar características específicas de la clase Console