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() 会消耗字符。
Tip: See this for the corrected program. This problem is same as scanf() followed by gets() in C/C++. This problem can also be solved by using next() instead of nextLine() for taking input of strings as shown here.
以下是Java中 Scanner 和 BufferedReader 类之间的主要区别
- BufferedReader 是同步的,而 Scanner 不是。如果我们使用多个线程,则应该使用 BufferedReader。
- BufferedReader 的缓冲内存比 Scanner 大得多。
- 与 BufferedReader(8KB 字节缓冲区)相比,Scanner 有一个小缓冲区(1KB 字符缓冲区),但绰绰有余。
- BufferedReader 比扫描器快一点,因为扫描器解析输入数据,而 BufferedReader 只是读取一个字符序列。