[英]Scanner vs. BufferedReader
據我所知,從 Java 文件中讀取基於字符的數據的兩種最常用方法是使用Scanner
或BufferedReader
。 我也知道BufferedReader
通過使用緩沖區來有效地讀取文件以避免物理磁盤操作。
我的問題是:
Scanner
的性能是否與BufferedReader
一樣好?Scanner
而不是BufferedReader
,反之亦然? Scanner
用於從流的內容中解析令牌,而BufferedReader
只是讀取流並且不進行任何特殊解析。
事實上,您可以將BufferedReader
作為要解析的字符源傳遞給scanner
。
在當前最新的 JDK 18 版本/構建 (b37) 中,與BufferedReader
( 8192 chars ) 相比, Scanner
的緩沖區 ( 1024 chars ) 更小,但綽綽有余。
至於選擇,如果要解析文件,請使用Scanner
,如果要逐行讀取文件,請使用BufferedReader
。 另請參閱他們之前鏈接的 API 文檔的介紹性文本。
Scanner
類中的所有nextXxx()
方法。請參閱此鏈接,從那里引用以下內容:
BufferedReader 是一個簡單的類,旨在有效地從底層流中讀取。 通常,由 Reader(如 FileReader)發出的每個讀取請求都會導致對底層流發出相應的讀取請求。 每次調用 read() 或 readLine() 都可能導致從文件中讀取字節,轉換為字符,然后返回,這可能非常低效。 如果 Reader 在 BufferedReader 中變形,效率會顯着提高。
BufferedReader 是同步的,因此 BufferedReader 上的讀取操作可以安全地從多個線程完成。
另一方面,掃描儀內置了更多的奶酪。 它可以做 BufferedReader 可以做的所有事情,而且效率也相同。 但是,除此之外,Scanner 可以使用正則表達式解析基本流的基本類型和字符串。 它還可以使用您選擇的分隔符標記基礎流。 它還可以不考慮分隔符對底層流進行前向掃描!
然而,掃描器不是線程安全的,它必須是外部同步的。
使用 BufferedReader 或 Scanner 的選擇取決於您正在編寫的代碼,如果您正在編寫一個簡單的日志閱讀器,緩沖閱讀器就足夠了。 但是,如果您正在編寫 XML 解析器,Scanner 是更自然的選擇。
即使在讀取輸入時,如果想逐行接受用戶輸入並說只是將其添加到文件中,BufferedReader 就足夠了。 另一方面,如果您想接受用戶輸入作為具有多個選項的命令,然后打算根據指定的命令和選項執行不同的操作,則 Scanner 將更適合。
BufferedReader
的緩沖內存比 Scanner 大得多。 如果您想從流中獲取長字符串,請使用BufferedReader
,如果您想從流中解析特定類型的令牌,請使用Scanner
。
Scanner
可以使用自定義分隔符使用 tokenize 並將流解析為原始類型的數據,而BufferedReader
只能讀取和存儲 String。
BufferedReader
是同步的,而Scanner
不是。 如果您使用多個線程,請使用BufferedReader
。
Scanner
隱藏 IOException 而BufferedReader
立即拋出它。
我建議使用BufferedReader
來閱讀文本。 Scanner
隱藏IOException
而BufferedReader
立即拋出它。
BufferedReader和Scanner的區別如下:
緩沖閱讀器:
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();
BufferedReader和Scanner的區別在於:
int
。JDK 1.1
上添加的,而Scanner是在JDK 5
版本上添加的。java.io
包,而Scanner來自java.util
包。根據這些點,我們可以選擇我們的選擇。
謝謝閱讀!
主要區別:
例子:
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();
從字符輸入流中讀取文本,緩沖字符,以便高效讀取字符、數組和行。
可以指定緩沖區大小,也可以使用默認大小。 對於大多數用途,默認值足夠大。
通常,由 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 是更自然的選擇。
更多信息請參考:
下面的答案取自從控制台讀取:JAVA Scanner vs BufferedReader
從控制台讀取輸入時,有兩個選項可以實現。 首先使用Scanner
,另一個使用BufferedReader
。 兩者都有不同的特點。 這意味着差異如何使用它。
Scanner
將給定的輸入視為令牌。 BufferedReader
只是逐行讀取給定的輸入作為字符串。 Scanner
本身提供解析功能,就像nextInt()
, nextFloat()
。
但是,其他人之間有什么區別?
Scanner
自JDK 1.5
及更高版本開始提供。
什么時候應該使用 Scanner 或 Buffered Reader?
查看它們之間的主要區別,一個使用標記化,另一個使用流線。 當您需要解析功能時,請改用Scanner
。 但是,我更喜歡BufferedReader
。 當您需要從文件中讀取數據時,請使用BufferedReader
,因為它在讀取文件時使用緩沖內存,從而減少了物理驅動器的使用。 或者您可以使用BufferedReader
作為Scanner
的輸入。
nio
的文件中讀取數據。 當我針對大文件的BufferedReader
性能測試nio
性能時, nio
顯示出更好的性能。我更喜歡Scanner
,因為它不會拋出已檢查的異常,因此它的使用會產生更精簡的代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.