java.util.Scanner類是一個(gè)簡(jiǎn)單的文本掃描類救赐,它可以解析基本數(shù)據(jù)類型和字符串畏铆。它本質(zhì)上是使用正則表達(dá)式去讀取不同的數(shù)據(jù)類型分冈。
Java.io.BufferedReader類為了能夠高效的讀取字符序列服鹅,從字符輸入流和字符緩沖區(qū)讀取文本讯赏。
下面是兩個(gè)類的不同之處:
當(dāng)nextLine()被用在nextXXX()之后繁扎,用Scanner類有什么問(wèn)題
嘗試去猜測(cè)下面代碼的輸出內(nèi)容育勺;
// Code using Scanner Class
import java.util.Scanner;
class Differ
{
public static void main(String args[])
{
Scanner scn = new Scanner(System.in);
System.out.println("Enter an integer");
int a = scn.nextInt();
System.out.println("Enter a String");
String b = scn.nextLine();
System.out.printf("You have entered:- "
+ a + " " + "and name as " + b);
}
}
Input:
50
Geek
Output:
Enter an integer
Enter a String
You have entered:- 50 and name as
讓我們嘗試使用BufferReader類线定,并且使用相同的輸入
// Code using BufferedReader Class
import java.io.*;
class Differ
{
public static void main(String args[])
throws IOException
{
BufferedReader br = new BufferedReader(new
InputStreamReader(System.in));
System.out.println("Enter an integer");
int a = Integer.parseInt(br.readLine());
System.out.println("Enter a String");
String b = br.readLine();
System.out.printf("You have entered:- " + a +
" and name as " + b);
}
}
Input:
50
Geek
Output:
Enter an integer
Enter a String
you have entered:- 50 and name as Geek
在Scanner類中如果我們?cè)谶@任何7個(gè)nextXXX()方法之后調(diào)用nextLine()方法野建,這nextLine()方法不能夠從控制臺(tái)讀取任何內(nèi)容属划,并且,這游標(biāo)不會(huì)進(jìn)入控制臺(tái)候生,它將跳過(guò)這一步同眯。這nextXXX()方法是這些方法,nextInt(),nextFloat(), nextByte(), nextShort(), nextDouble(), nextLong(), next()唯鸭。
在BufferReader類中就沒(méi)有那種問(wèn)題须蜗。這種問(wèn)題僅僅出現(xiàn)在Scanner類中,由于nextXXX()方法忽略換行符目溉,但是明肮,nextLine()并不忽略它。如果我們?cè)趎extXXX()方法和nextLine()方法之間使用超過(guò)一個(gè)以上的nextLine()方法缭付,這個(gè)問(wèn)題將不會(huì)出現(xiàn)了柿估;因?yàn)閚extLine()把換行符消耗了∠菝ǎ可以參考這個(gè)程序的正確寫法秫舌。這個(gè)問(wèn)題和C/C++中的scanf()方法緊跟gets()方法的問(wèn)題一樣。
其他的不同點(diǎn):
- BufferedReader是支持同步的绣檬,而Scanner不支持舅巷。如果我們處理多線程程序,BufferedReader應(yīng)當(dāng)使用河咽。
- BufferedReader相對(duì)于Scanner有足夠大的緩沖區(qū)內(nèi)存。
- Scanner有很少的緩沖區(qū)(1KB字符緩沖)相對(duì)于BufferedReader(8KB字節(jié)緩沖)赋元,但是這是綽綽有余的忘蟹。
- BufferedReader相對(duì)于Scanner來(lái)說(shuō)要快一點(diǎn)飒房,因?yàn)镾canner對(duì)輸入數(shù)據(jù)進(jìn)行類解析,而BufferedReader只是簡(jiǎn)單地讀取字符序列媚值。
原文鏈接:Difference between Scanner and BufferReader Class in Java
翻譯:crane-yuan
[ 轉(zhuǎn)載請(qǐng)保留原文出處狠毯、譯者和譯文鏈接。]