Java中Scanner類和BufferReader類之間的區別,javabufferreader
java.util.Scanner類是一個簡單的文本掃描類,它可以解析基礎資料型別 (Elementary Data Type)和字串。它本質上是使用Regex去讀取不同的資料類型。
Java.io.BufferedReader類為了能夠高效的讀取字元序列,從字元輸入資料流和字元緩衝區讀取文本。
下面是兩個類的不同之處:
當nextLine()被用在nextXXX()之後,用Scanner類有什麼問題
嘗試去猜測下面代碼的輸出內容;
// Code using Scanner Classimport 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:
50Geek
Output:
Enter an integerEnter a StringYou have entered:- 50 and name as
讓我們嘗試使用BufferReader類,並且使用相同的輸入
// Code using BufferedReader Classimport 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:
50Geek
Output:
Enter an integerEnter a Stringyou have entered:- 50 and name as Geek
在Scanner類中如果我們在這任何7個nextXXX()方法之後調用nextLine()方法,這nextLine()方法不能夠從控制台讀取任何內容,並且,這遊標不會進入控制台,它將跳過這一步。這nextXXX()方法是這些方法,nextInt(),nextFloat(), nextByte(), nextShort(), nextDouble(), nextLong(), next()。
在BufferReader類中就沒有那種問題。這種問題僅僅出現在Scanner類中,由於nextXXX()方法忽略***分行符號***,但是,nextLine()並不忽略它。如果我們在nextXXX()方法和nextLine()方法之間使用超過一個以上的nextLine()方法,這個問題將不會出現了;因為nextLine()把分行符號消耗了。可以參考這個程式的正確寫法(http://code.geeksforgeeks.org/CErAhD)。這個問題和C/C++(http://www.geeksforgeeks.org/problem-with-scanf-when-there-is-fgetsgetsscanf-after-it/)中的scanf()方法緊跟gets()方法的問題一樣。
其他的不同點:
- BufferedReader是支援同步的,而Scanner不支援。如果我們處理多線程程式,BufferedReader應當使用。
- BufferedReader相對於Scanner有足夠大的緩衝區記憶體。
- Scanner有很少的緩衝區(1KB字元緩衝)相對於BufferedReader(8KB位元組緩衝),但是這是綽綽有餘的。
- BufferedReader相對於Scanner來說要快一點,因為Scanner對輸入資料進行類解析,而BufferedReader只是簡單地讀取字元序列。
原文連結:Difference between Scanner and BufferReader Class in Java(http://www.geeksforgeeks.org/difference-between-scanner-and-bufferreader-class-in-java/)
翻譯:crane-yuan
[ 轉載請保留原文出處、譯者和譯文連結。]