在 Java 中,BufferReader 類和 Scanner 類都可用於讀取輸入,但由於其底層實現不同因此它們的效能也不同。 一般來說,BufferReader 類的處理速度比 Scanner 類更快,這是因為它處理輸入和解析的方式不同。 本文將對詳細說明是什麼原因讓BufferReader處理IO的效率優與Scanner。
主要概念
BufferReader
BufferReader 是 java.io 包中的一個類,用於從字元輸入流中讀取文字,緩衝字元以提供高效的字元、陣列和行的讀取,在讀取過程中 BufferReader 類並不會解析輸入資料,因此在進行簡單的讀取操作時速度更快。
要點:
可以讀取原始的字元或字串。
不提供解析功能。
適合高效地讀取大塊資料(大檔案資料)。
示例:
/*package whatever //do not write package name here */ import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class BufferedReaderExample { public static void main(String[] args) { try (BufferedReader reader = new BufferedReader(new FileReader("input.txt"))) { String line; while ((line = reader.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } } }
java.io.FileNotFoundException: input.txt (沒有這樣的檔案或目錄)
在 java.base/java.io.FileInputStream.open0(Native 方法)
在 java.base/java.io.FileInputStream.open(FileInputStream.java:219)
在 java.base/java.io.FileInputStream.<init>(FileInputStream.java:157)
在 java.base/java.io.FileInputStream.<init>(FileInputStream.java:112)
在 java.base/java.io.FileReader.<init>(FileReader.java:60)
在 BufferedReaderExample.main(BufferedReaderExample.java:10)
在這個示例中,BufferReader 可以高效地讀取檔案中的每一行,而不會產生任何解析開銷。
Scanner
Scanner 是 java.util 軟體包中的一個類,它使用分隔符模式(預設情況下與空格匹配)將輸入內容分解成標記。 Scanner 類可以使用正規表示式解析原始型別和字串。
要點:
它可以同時讀取和解析輸入。
它可以提供用於解析不同資料型別的內建方法。例如 nextInt()、nextDouble()。
它便於在單個步驟中讀取和解析輸入,但由於解析的開銷而較慢。
例
/*package whatever //do not write package name here */ import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; public class ScannerExample { public static void main(String[] args) { try (Scanner scanner = new Scanner(new File("input.txt"))) { while (scanner.hasNextLine()) { String line = scanner.nextLine(); System.out.println(line); } } catch (FileNotFoundException e) { e.printStackTrace(); } } }
java.io.FileNotFoundException: input.txt (沒有這樣的檔案或目錄)
在 java.base/java.io.FileInputStream.open0(Native 方法)
在 java.base/java.io.FileInputStream.open(FileInputStream.java:219)
在 java.base/java.io.FileInputStream.<init>(FileInputStream.java:157)
在 java.base/java.util.Scanner.<init>(Scanner.java:639)
在 ScannerExample.main(ScannerExample.java:10)
在此示例中,Scanner 可以從檔案中讀取每一行,也可以分析標記,但與 BufferReader 相比,這會帶來額外的開銷。
效能比較
之所以出現效能差異,是因為 BufferReader 只讀取字元而不會嘗試解析,但是 Scanner 會根據指定的分隔符和資料型別對輸入進行解析。 這一解析步驟可能需要額外的處理時間,使得 Scanner 在處理大檔案時比 BufferReader 要慢。
結論
雖然 BufferReader 和 Scanner 都適用於在 Java 中讀取輸入內容,但 BufferReader 由於不需要解析開銷,因此在簡單的讀取操作中效率更高。而 Scanner 提供了同時讀取和解析輸入的更便捷方法,如果輸入檔案不大或者有解析輸入內容的需求時使用Scanner更合適,
所以對於效能非常重要且不需要解析的場景最好使用 BufferReader,如果更看重易用性和解析能力,Scanner 則是更好的選擇。