有没有适合使用 java.util.Scanner 来读取某种输入的情况?在我的小测试中,我发现它与 java.util.Bufferedreader 或从 java.util.InputStreamReader 实现您自己的阅读器相比非常慢。
那么我为什么要使用扫描仪有什么理由吗?
有没有适合使用 java.util.Scanner 来读取某种输入的情况?在我的小测试中,我发现它与 java.util.Bufferedreader 或从 java.util.InputStreamReader 实现您自己的阅读器相比非常慢。
那么我为什么要使用扫描仪有什么理由吗?
该类的Scanner
主要目的是使用正则表达式解析原始类型和字符串的文本。您可以提供多种资源类型以供读取。
虽然 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
虽然相对差异很大,但扫描仪每个都小于几微秒。
Scanner - 它的许多方法是将输入流解析为标记的想法。BufferedReader 不依赖于将其输入分解为标记。如果需要,它允许您逐个字符地阅读。它可以读取整行,让你做你想做的事。一个扫描仪进去;它可以做 BufferedReader 可以做的所有事情,而且效率也相同。但是,除此之外,Scanner 可以使用正则表达式解析基本流的基本类型和字符串。它还可以使用您选择的分隔符标记基础流。它还可以不考虑分隔符对底层流进行前向扫描!
编辑只是忘了提及...... “但是扫描仪不是线程安全的,它必须是外部同步的。”
java.lang.util.scanner
这是和之间的区别java.lang.util buffered reader
。虽然两者都可用于在 java 类中从用户那里获取输入,但有一个显着的区别需要理解。
Scanner 是一个使用空格作为默认分隔符的单令牌输入系统。尽管您可以使用各种其他方法将其更改为其他格式。
而缓冲阅读器是一个缓冲输入系统。它需要数据块(流),然后输入用户想要存储它的数据类型。因此,在您刷新或缓冲区已满之前,读取器流不会为您提供数据。