📜  Java中 Scanner 和 BufferedReader 类的区别

📅  最后修改于: 2022-05-13 01:54:29.275000             🧑  作者: Mango

Java中 Scanner 和 BufferedReader 类的区别

在Java中,Scanner 和 BufferedReader 类是用作读取输入方式的源。 Scanner 类是一个简单的文本扫描器,可以解析原始类型和字符串。它在内部使用正则表达式来读取不同的类型,而另一方面 BufferedReader 类从字符输入流中读取文本,缓冲字符以提供对字符序列的有效读取

古怪的区别在于通过 next() 方法读取不同的输入方式,这在下面的程序中对类似的输入集是合理的。

示例 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);
    }
}


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);
    }
}


输出:

让我们尝试使用 Buffer 类和下面的相同输入,如下所示:

示例 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);
    }
}

输出:

输出说明:在 Scanner 类中,如果我们在七个 nextXXX() 方法中的任何一个之后调用 nextLine() 方法,则 nextLine() 不会从控制台读取值,并且光标不会进入控制台,它将跳过该步骤。 nextXXX() 方法是 nextInt()、nextFloat()、nextByte()、nextShort()、nextDouble()、nextLong()、next()。
在 BufferReader 类中不存在此类问题。此问题仅发生在 Scanner 类中,因为 nextXXX() 方法忽略了字符,并且 nextLine() 只读取到第一个字符。如果我们在 nextXXX() 和 nextLine() 之间再调用一次 nextLine() 方法,则不会出现此问题,因为 nextLine() 会消耗字符。

以下是Java中 Scanner 和 BufferedReader 类之间的主要区别

  • BufferedReader 是同步的,而 Scanner 不是。如果我们使用多个线程,则应该使用 BufferedReader。
  • BufferedReader 的缓冲内存比 Scanner 大得多。
  • 与 BufferedReader(8KB 字节缓冲区)相比,Scanner 有一个小缓冲区(1KB 字符缓冲区),但绰绰有余。
  • BufferedReader 比扫描器快一点,因为扫描器解析输入数据,而 BufferedReader 只是读取一个字符序列。