📅  最后修改于: 2020-03-24 13:09:54             🧑  作者: Mango
java.util.Scanner类是一个简单的文本扫描器,可以解析原始类型和字符串。它在内部使用正则表达式读取不同的类型。
java.io.BufferedReader类从字符输入流中读取文本,缓冲字符,以便有效读取字符序列。
以下是上述两者之间的区别。
在nextXXX()之后使用nextLine()时,Scanner出现问题
尝试猜测以下代码的输出:
// Java使用Scanner类
import java.util.Scanner;
class Differ
{
public static void main(String args[])
{
Scanner scn = new Scanner(System.in);
System.out.println("输入一个整数");
int a = scn.nextInt();
System.out.println("输入一个String");
String b = scn.nextLine();
System.out.printf("您输入了:- "
+ a + " " + "and name as " + b);
}
}
输入:
50
芒果
输出:
输入一个integer
输入一个String
您输入了:- 50 and name as
让我们使用Buffer类和相同的Input尝试相同的操作
// Java展示使用Buffer类
import java.io.*;
class Differ
{
public static void main(String args[])
throws IOException
{
BufferedReader br = new BufferedReader(new
InputStreamReader(System.in));
System.out.println("输入一个整数");
int a = Integer.parseInt(br.readLine());
System.out.println("输入一个String");
String b = br.readLine();
System.out.printf("您输入了:- " + a +
" and name as " + b);
}
}
输入:
50
芒果
输出:
输入一个整数
输入一个String
您输入了:- 50 and name as 芒果
nextXXX()方法有:nextInt(),nextFloat(),nextByte(),nextShort(),nextDouble(),nextLong(),next()。在Scanner类中,如果我们在七个nextXXX()方法中的任何一个之后调用nextLine()方法,则nextLine()不会从控制台读取值,并且光标不会进入控制台,它将跳过该步骤。
在BufferReader类中,没有这种类型的问题。由于nextXXX()方法忽略换行符,并且nextLine()仅读取直到第一个换行符,因此仅对于Scanner类会出现此问题。如果我们在nextXXX()和nextLine()之间再使用一次nextLine()方法的调用,则不会发生此问题,因为nextLine()将消耗换行符。此问题与C/C++中的scanf()和后跟gets()的问题相同。
其他差异: