Diferencia entre la clase Scanner y BufferedReader en Java

En Java, las clases Scanner y BufferedReader son fuentes que sirven como formas de leer entradas. La clase Scanner es un escáner de texto simple que puede analizar strings y tipos primitivos. Utiliza internamente expresiones regulares para leer diferentes tipos mientras que, por otro lado , la clase BufferedReader lee texto de un flujo de entrada de caracteres, almacenando caracteres en búfer para proporcionar una lectura eficiente de la secuencia de caracteres.

La diferencia excéntrica radica en leer diferentes formas de tomar entrada a través del método next() que se justifica en los siguientes programas sobre el conjunto de entrada similar.

Ejemplo 1:

Java

// Java Program to Illustrate Scanner Class
 
// Importing Scanner class from
// java.util package
import java.util.Scanner;
 
// Main class
class GFG {
 
    // Main driver method
    public static void main(String args[])
    {
 
        // Creating object of Scanner class to
        // read input from keyboard
        Scanner scn = new Scanner(System.in);
 
        System.out.println("Enter an integer");
 
        // Using nextInt() to parse integer values
        int a = scn.nextInt();
 
        System.out.println("Enter a String");
 
        // Using nextLine() to parse string values
        String b = scn.nextLine();
 
        // Display name and age entered above
        System.out.printf("You have entered:- " + a + " "
                          + "and name as " + b);
    }
}

Producción:

Probemos lo mismo usando la clase Buffer y la misma entrada a continuación de la siguiente manera: 

Ejemplo 2:

Java

// Java Program to Illustrate BufferedReader Class
 
// Importing required class
import java.io.*;
 
// Main class
class GFG {
 
    // Main driver method
    public static void main(String args[])
        throws IOException
    {
 
        // Creating object of class inside main() method
        BufferedReader br = new BufferedReader(
            new InputStreamReader(System.in));
 
        System.out.println("Enter an integer");
 
        // Taking integer input
        int a = Integer.parseInt(br.readLine());
 
        System.out.println("Enter a String");
 
        String b = br.readLine();
 
        // Printing input entities above
        System.out.printf("You have entered:- " + a
                          + " and name as " + b);
    }
}

Producción:

Explicación de los resultados: en la clase Scanner, si llamamos al método nextLine() después de cualquiera de los siete métodos nextXXX(), entonces nextLine() no lee los valores de la consola y el cursor no entrará en la consola, omitirá ese paso. Los métodos nextXXX() son nextInt(), nextFloat(), nextByte(), nextShort(), nextDouble(), nextLong(), next().
En la clase BufferReader no existe ese tipo de problema. Este problema ocurre solo para la clase Scanner, debido a que los métodos nextXXX() ignoran el carácter de nueva línea y nextLine() solo lee hasta el primer carácter de nueva línea. Si usamos una llamada más del método nextLine() entre nextXXX() y nextLine(), entonces este problema no ocurrirá porque nextLine() consumirá el carácter de nueva línea. 

Sugerencia: Vea esto para el programa corregido. Este problema es el mismo que scanf() seguido de gets() en C/C++ . Este problema también se puede resolver usando next() en lugar de nextLine() para ingresar strings como se muestra aquí .

Las siguientes son las principales diferencias entre la clase Scanner y BufferedReader en Java

  • BufferedReader es síncrono mientras que Scanner no lo es. BufferedReader debe usarse si estamos trabajando con múltiples subprocesos.
  • BufferedReader tiene una memoria de búfer significativamente mayor que Scanner.
  • El escáner tiene un pequeño búfer (búfer de caracteres de 1 KB) a diferencia del BufferedReader (búfer de 8 KB de bytes), pero es más que suficiente.
  • BufferedReader es un poco más rápido en comparación con el escáner porque el escáner analiza los datos de entrada y BufferedReader simplemente lee una secuencia de caracteres.

Este artículo es una contribución de Pranav Adarsh . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo y enviarlo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks. Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *