簡體   English   中英

掃描儀與 BufferedReader

[英]Scanner vs. BufferedReader

據我所知,從 Java 文件中讀取基於字符的數據的兩種最常用方法是使用ScannerBufferedReader 我也知道BufferedReader通過使用緩沖區來有效地讀取文件以避免物理磁盤操作。

我的問題是:

  • Scanner的性能是否與BufferedReader一樣好?
  • 為什么你會選擇Scanner而不是BufferedReader ,反之亦然?

Scanner用於從流的內容中解析令牌,而BufferedReader只是讀取流並且不進行任何特殊解析。

事實上,您可以將BufferedReader作為要解析的字符源傳遞給scanner

在當前最新的 JDK 18 版本/構建 (b37) 中,與BufferedReader ( 8192 chars ) 相比, Scanner的緩沖區 ( 1024 chars ) 更小,但綽綽有余。

至於選擇,如果要解析文件,請使用Scanner ,如果要逐行讀取文件,請使用BufferedReader 另請參閱他們之前鏈接的 API 文檔的介紹性文本。

  • 解析= 將給定的輸入解釋為標記(部分)。 它能夠直接將特定部分作為 int、string、decimal 等返回給您。另請參閱Scanner類中的所有nextXxx()方法。
  • 閱讀=愚蠢的流媒體。 它不斷地回饋你所有的角色,如果你想匹配或組成一些有用的東西,你必須手動檢查這些角色。 但是,如果您無論如何都不需要這樣做,那么閱讀就足夠了。

請參閱此鏈接,從那里引用以下內容:

BufferedReader 是一個簡單的類,旨在有效地從底層流中讀取。 通常,由 Reader(如 FileReader)發出的每個讀取請求都會導致對底層流發出相應的讀取請求。 每次調用 read() 或 readLine() 都可能導致從文件中讀取字節,轉換為字符,然后返回,這可能非常低效。 如果 Reader 在 BufferedReader 中變形,效率會顯着提高。

BufferedReader 是同步的,因此 BufferedReader 上的讀取操作可以安全地從多個線程完成。

另一方面,掃描儀內置了更多的奶酪。 它可以做 BufferedReader 可以做的所有事情,而且效率也相同。 但是,除此之外,Scanner 可以使用正則表達式解析基本流的基本類型和字符串。 它還可以使用您選擇的分隔符標記基礎流。 它還可以不考慮分隔符對底層流進行前向掃描!

然而,掃描器不是線程安全的,它必須是外部同步的。

使用 BufferedReader 或 Scanner 的選擇取決於您正在編寫的代碼,如果您正在編寫一個簡單的日志閱讀器,緩沖閱讀器就足夠了。 但是,如果您正在編寫 XML 解析器,Scanner 是更自然的選擇。

即使在讀取輸入時,如果想逐行接受用戶輸入並說只是將其添加到文件中,BufferedReader 就足夠了。 另一方面,如果您想接受用戶輸入作為具有多個選項的命令,然后打算根據指定的命令和選項執行不同的操作,則 Scanner 將更適合。

  1. BufferedReader的緩沖內存比 Scanner 大得多。 如果您想從流中獲取長字符串,請使用BufferedReader ,如果您想從流中解析特定類型的令牌,請使用Scanner

  2. Scanner可以使用自定義分隔符使用 tokenize 並將流解析為原始類型的數據,而BufferedReader只能讀取和存儲 String。

  3. BufferedReader是同步的,而Scanner不是。 如果您使用多個線程,請使用BufferedReader

  4. Scanner隱藏 IOException 而BufferedReader立即拋出它。

我建議使用BufferedReader來閱讀文本。 Scanner隱藏IOExceptionBufferedReader立即拋出它。

BufferedReaderScanner的區別如下:

  1. BufferedReader 已同步,但 Scanner未同步
  2. BufferedReader 是線程安全的,但 Scanner不是線程安全的
  3. BufferedReader具有較大的緩沖內存,但 Scanner具有較小的緩沖內存
  4. BufferedReader速度更快,但 Scanner執行速度較慢
  5. 從控制台讀取一行的代碼:

緩沖閱讀器

InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String st = br.readLine();
       
// You can make the object InputStreamReader object inside the BufferReader method.
BufferReader br = new BufferedReader(InputStreamReader(System.in));
String st = br.readLine();

// You can even inspect the type of the input stream manually by using Parse method which accepts string parameter.
int x = Integer.parseInt(br.readLine());

// Or you can pass the object directly.
int x = Integer.parseInt(st);

掃描儀

Scanner sc = new Scanner(System.in);
String st = sc.nextLine();

BufferedReaderScanner的區別在於:

  1. BufferedReader讀取數據,但Scanner解析數據。
  2. 您只能使用BufferedReader讀取 String ,使用Scanner您可以讀取不同的數據類型,例如int
  3. BufferedReaderScanner舊,它是在JDK 1.1上添加的,而Scanner是在JDK 5版本上添加的。
  4. Scanner的 1KB 相比, BufferedReader的緩沖區大小更大(8KB)。
  5. BufferedReader更適合讀取長 String 的文件,而Scanner更適合從命令提示符讀取小的用戶輸入。
  6. BufferedReader是同步的,而Scanner不是,這意味着您不能在多個線程之間共享Scanner
  7. BufferedReaderScanner更快,因為它不花時間進行解析。
  8. BufferedReaderScanner快一點。
  9. BufferedReader來自java.io包,而Scanner來自java.util包。

根據這些點,我們可以選擇我們的選擇。

謝謝閱讀!

主要區別:

  1. 掃描器

  • 簡單的文本掃描器,可以使用正則表達式解析原始類型和字符串。
  • Scanner 使用分隔符模式將其輸入分解為標記,默認情況下匹配空格。 然后可以使用各種 next 方法將生成的標記轉換為不同類型的值。

例子:

 String input = "1 fish 2 fish red fish blue fish";
 Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*");
 System.out.println(s.nextInt());
 System.out.println(s.nextInt());
 System.out.println(s.next());
 System.out.println(s.next());
 s.close(); 

打印以下輸出:

1
2
red
blue

使用此代碼可以生成相同的輸出,該代碼使用正則表達式一次解析所有四個標記:

 String input = "1 fish 2 fish red fish blue fish";

 Scanner s = new Scanner(input);
 s.findInLine("(\\d+) fish (\\d+) fish (\\w+) fish (\\w+)");
 MatchResult result = s.match();
 for (int i = 1; i <= result.groupCount(); i++) {
     System.out.println(result.group(i));
 }
 s.close();

  1. 緩沖閱讀器:
  • 從字符輸入流中讀取文本,緩沖字符,以便高效讀取字符、數組和行。

  • 可以指定緩沖區大小,也可以使用默認大小。 對於大多數用途,默認值足夠大。

通常,由 Reader 發出的每個讀取請求都會導致對底層字符或字節流發出相應的讀取請求。 因此,建議將 BufferedReader 包裹在 read() 操作可能成本高昂的任何 Reader 周圍,例如 FileReaders 和 InputStreamReaders。 例如,

BufferedReader in = new BufferedReader(new FileReader("foo.in"));
 

將緩沖來自指定文件的輸入。 如果沒有緩沖,每次調用 read() 或 readLine() 都可能導致從文件中讀取字節,轉換為字符,然后返回,這可能非常低效。 使用 DataInputStreams 進行文本輸入的程序可以通過將每個 DataInputStream 替換為適當的 BufferedReader 來本地化。

使用的來源: https ://docs.oracle.com

在java中有不同的輸入方式,例如:

1) BufferedReader 2) Scanner 3) 命令行參數

BufferedReader 從字符輸入流中讀取文本,緩沖字符,以便高效讀取字符、數組和行。

Scanner 是一個簡單的文本掃描器,可以使用正則表達式解析原始類型和字符串。

如果您正在編寫一個簡單的日志閱讀器,緩沖閱讀器就足夠了。 如果您正在編寫 XML 解析器 Scanner 是更自然的選擇。

更多信息請參考:

http://java.meritcampus.com/t/240/Bufferedreader?tc=mm69

下面的答案取自從控制台讀取:JAVA Scanner vs BufferedReader

從控制台讀取輸入時,有兩個選項可以實現。 首先使用Scanner ,另一個使用BufferedReader 兩者都有不同的特點。 這意味着差異如何使用它。

Scanner將給定的輸入視為令牌。 BufferedReader只是逐行讀取給定的輸入作為字符串。 Scanner本身提供解析功能,就像nextInt()nextFloat()

但是,其他人之間有什么區別?

  • 掃描器將給定的輸入視為令牌。 BufferedReader作為流線/字符串。
  • 掃描儀使用正則表達式對給定的輸入進行標記。 使用BufferedReader必須編寫額外的代碼。
  • BufferedReaderScanner *point no. 快。 2
  • Scanner不同步, BufferedReader同步

ScannerJDK 1.5及更高版本開始提供。

什么時候應該使用 Scanner 或 Buffered Reader?

查看它們之間的主要區別,一個使用標記化,另一個使用流線。 當您需要解析功能時,請改用Scanner 但是,我更喜歡BufferedReader 當您需要從文件中讀取數據時,請使用BufferedReader ,因為它在讀取文件時使用緩沖內存,從而減少了物理驅動器的使用。 或者您可以使用BufferedReader作為Scanner的輸入。

  1. BufferedReader 可能會給您帶來更好的性能(因為 Scanner 基於 InputStreamReader,請查看源代碼)。 哎呀,從它使用nio的文件中讀取數據。 當我針對大文件的BufferedReader性能測試nio性能時, nio顯示出更好的性能。
  2. 要從文件中讀取數據,請嘗試Apache Commons IO

我更喜歡Scanner ,因為它不會拋出已檢查的異常,因此它的使用會產生更精簡的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM