2012-09-12 65 views
4

可能重複:
Scanner vs. BufferedReader爲什麼存在java.util.Scanner?

是否有它的apropriate爲了讀取某種輸入使用java.util.Scanner中的任何情況嗎?在我的小測試中,我發現它比java.util.Bufferedreader慢得多,或者從java.util.InputStreamReader實現自己的讀取器。

所以有什麼理由爲什麼我想要使用掃描儀?

+1

很奇怪。我通常會問自己爲什麼我不會使用掃描儀。 – UmNyobe

回答

4

Scanner類的主要用途是使用正則表達式解析原始類型和字符串的文本。您可以提供多種資源類型供讀取。

6

docs

一個簡單的文本掃描儀可以解析基本類型和字符串 使用正則表達式。

這不會做BufferedReader。

+0

只是爲了進一步添加掃描器不是線程安全的,但是比BufferReader更強大。它內置了更多的奶酪。 – amod

0

掃描儀 - 它的許多方法是將輸入流解析爲標記的想法。 BufferedReader不依賴於將其輸入分解爲令牌。它允許你逐字閱讀字符,如果你想。它可以閱讀整行內容,讓你做你想做的事。 將掃描儀放入其中;它可以完成BufferedReader所能做的所有事情,並且效率也一樣。但是,另外Scanner可以使用正則表達式解析基本類型和字符串的基礎流。它也可以使用您選擇的分隔符標記底層的流。它也可以對基礎流進行正向掃描,忽略分隔符!

編輯只是忘記提及...... 「但是掃描儀不是線程安全的,它必須在外部同步。」

3

儘管掃描儀相對較慢,但速度通常不夠快,而且比BufferedReader功能強大得多。

public static void main(String... args) throws IOException { 

    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < 10000; i++) 
     sb.append("line: ").append(i).append("\n"); 
    String lines = sb.toString(); 

    for (int i = 0; i < 6; i++) { 
     testBufferedReader(lines); 
     testScanner(lines); 
    } 
} 

private static void testBufferedReader(String text) throws IOException { 
    int count = 0; 
    BufferedReader br = new BufferedReader(new StringReader(text)); 
    long start = System.nanoTime(); 
    while (br.readLine() != null) 
     count++; 
    long time = System.nanoTime() - start; 
    System.out.printf("BufferedReader.readLine() took an average of %,d ns count=%,d%n", time/count, count); 
} 

private static void testScanner(String text) throws IOException { 
    int count = 0; 
    Scanner sc = new Scanner(new StringReader(text)); 
    long start = System.nanoTime(); 

    while (sc.hasNextLine()) { 
     sc.nextLine(); 
     count++; 
    } 

    long time = System.nanoTime() - start; 
    System.out.printf("Scanner nextLine took an average of %,d ns count=%,d%n", time/count, count); 
} 

最後打印

BufferedReader.readLine() took an average of 124 ns count=10,000 
Scanner nextLine took an average of 1,549 ns count=10,000 

雖然相對差大時,掃描儀是小於幾個每個微秒。

0

以下是java.lang.util.scannerjava.lang.util buffered reader之間的區別。雖然兩者都有用於從java類的用戶處獲得輸入,但需要理解的顯着差異。

掃描儀是一種使用空格作爲默認分隔符的單一令牌輸入系統。儘管您可以使用各種其他方法將其更改爲其他格式。

雖然緩衝讀取器是緩衝輸入系統。它接收數據塊(流),然後饋送到用戶想要存儲它的數據類型中。因此,直到您刷新或緩衝區已滿,讀取器流纔會給您提供數據。