是否有它的apropriate爲了讀取某種輸入使用java.util.Scanner中的任何情況嗎?在我的小測試中,我發現它比java.util.Bufferedreader慢得多,或者從java.util.InputStreamReader實現自己的讀取器。
所以有什麼理由爲什麼我想要使用掃描儀?
是否有它的apropriate爲了讀取某種輸入使用java.util.Scanner中的任何情況嗎?在我的小測試中,我發現它比java.util.Bufferedreader慢得多,或者從java.util.InputStreamReader實現自己的讀取器。
所以有什麼理由爲什麼我想要使用掃描儀?
Scanner
類的主要用途是使用正則表達式解析原始類型和字符串的文本。您可以提供多種資源類型供讀取。
掃描儀 - 它的許多方法是將輸入流解析爲標記的想法。 BufferedReader不依賴於將其輸入分解爲令牌。它允許你逐字閱讀字符,如果你想。它可以閱讀整行內容,讓你做你想做的事。 將掃描儀放入其中;它可以完成BufferedReader所能做的所有事情,並且效率也一樣。但是,另外Scanner可以使用正則表達式解析基本類型和字符串的基礎流。它也可以使用您選擇的分隔符標記底層的流。它也可以對基礎流進行正向掃描,忽略分隔符!
編輯只是忘記提及...... 「但是掃描儀不是線程安全的,它必須在外部同步。」
儘管掃描儀相對較慢,但速度通常不夠快,而且比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
雖然相對差大時,掃描儀是小於幾個每個微秒。
以下是java.lang.util.scanner
和java.lang.util buffered reader
之間的區別。雖然兩者都有用於從java類的用戶處獲得輸入,但需要理解的顯着差異。
掃描儀是一種使用空格作爲默認分隔符的單一令牌輸入系統。儘管您可以使用各種其他方法將其更改爲其他格式。
雖然緩衝讀取器是緩衝輸入系統。它接收數據塊(流),然後饋送到用戶想要存儲它的數據類型中。因此,直到您刷新或緩衝區已滿,讀取器流纔會給您提供數據。
很奇怪。我通常會問自己爲什麼我不會使用掃描儀。 – UmNyobe