切換語言為:簡體

在 java 中為什麼 BufferedReader 類的 I/O 操作效率比 Scanner 類高

  • 爱糖宝
  • 2024-07-20
  • 2074
  • 0
  • 0

在 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 則是更好的選擇。


0則評論

您的電子郵件等資訊不會被公開,以下所有項目均必填

OK! You can skip this field.