在 Java 中,Scanner 和 BufferedReader 类是用作读取输入的方式的源。 Scanner class 是一个简单的文本扫描器,可以解析原始类型和字符串。它内部使用正则表达式来读取不同类型,而另一方面 BufferedReader class 从 character-input 流中读取文本,缓冲字符以便高效读取字符序列
奇怪的差异在于通过 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 & a String");
// Using nextInt() to parse integer values
int a = scn.nextInt();
// 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);
}
}
输出:
Enter an integer & a String 10 John You have entered:- 10 and name as John
让我们尝试使用 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 类中,如果我们调用 nextLine()方法在七个中的任何一个之后nextXXX()方法那么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 这里.
以下是 Java 中 Scanner 和 BufferedReader 类之间的主要区别
- BufferedReader 是同步的,而扫描仪不是同步的。如果我们使用多个线程,则应使用BufferedReader。
- BufferedReader 的缓冲存储器比扫描仪大得多。
- 扫描仪有一个小缓冲区(1KB 字符缓冲区),而不是 BufferedReader(8KB 字节缓冲区),但它已经足够了。
- BufferedReader 与 Scanner 相比要快一些,因为 Scanner 会解析输入数据,而 BufferedReader 只是读取字符序列。
相关用法
- Java Scanner findWithinHorizon()用法及代码示例
- Java Scanner hasNext()用法及代码示例
- Java Scanner next()用法及代码示例
- Java Scanner remove()用法及代码示例
- Java Scanner tokens()用法及代码示例
- Java Scanner close()用法及代码示例
- Java Scanner delimiter()用法及代码示例
- Java Scanner findInLine()用法及代码示例
- Java Scanner hasNextBigDecimal()用法及代码示例
- Java Scanner hasNextBoolean()用法及代码示例
- Java Scanner hasNextDouble()用法及代码示例
- Java Scanner hasNextFloat()用法及代码示例
- Java Scanner hasNextLine()用法及代码示例
- Java Scanner hasNextShort()用法及代码示例
- Java Scanner ioException()用法及代码示例
- Java Scanner locale()用法及代码示例
- Java Scanner match()用法及代码示例
- Java Scanner nextBigDecimal()用法及代码示例
- Java Scanner nextBigInteger()用法及代码示例
- Java Scanner nextBoolean()用法及代码示例
- Java Scanner nextByte()用法及代码示例
- Java Scanner nextDouble()用法及代码示例
- Java Scanner nextFloat()用法及代码示例
- Java Scanner nextInt()用法及代码示例
- Java Scanner nextLine()用法及代码示例
注:本文由纯净天空筛选整理自佚名大神的英文原创作品 Difference Between Scanner and BufferedReader Class in Java。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。