3

可能重复:
Scanner vs. BufferedReader

有没有适合使用 java.util.Scanner 来读取某种输入的情况?在我的小测试中,我发现它与 java.util.Bufferedreader 或从 java.util.InputStreamReader 实现您自己的阅读器相比非常慢。

那么我为什么要使用扫描仪有什么理由吗?

4

5 回答 5

6

文档

一个简单的文本扫描器,可以使用正则表达式解析原始类型和字符串。

那不会做一个BufferedReader。

于 2012-09-12T12:30:09.840 回答
4

该类的Scanner主要目的是使用正则表达式解析原始类型和字符串的文本。您可以提供多种资源类型以供读取。

于 2012-09-12T12:30:33.473 回答
3

虽然 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

虽然相对差异很大,但扫描仪每个都小于几微秒。

于 2012-09-12T12:42:24.597 回答
0

Scanner - 它的许多方法是将输入流解析为标记的想法。BufferedReader 不依赖于将其输入分解为标记。如果需要,它允许您逐个字符地阅读。它可以读取整行,让你做你想做的事。一个扫描仪进去;它可以做 BufferedReader 可以做的所有事情,而且效率也相同。但是,除此之外,Scanner 可以使用正则表达式解析基本流的基本类型和字符串。它还可以使用您选择的分隔符标记基础流。它还可以不考虑分隔符对底层流进行前向扫描!

编辑只是忘了提及...... “但是扫描仪不是线程安全的,它必须是外部同步的。”

于 2012-09-12T12:34:40.717 回答
0

java.lang.util.scanner这是和之间的区别java.lang.util buffered reader。虽然两者都可用于在 java 类中从用户那里获取输入,但有一个显着的区别需要理解。

Scanner 是一个使用空格作为默认分隔符的单令牌输入系统。尽管您可以使用各种其他方法将其更改为其他格式。

而缓冲阅读器是一个缓冲输入系统。它需要数据块(流),然后输入用户想要存储它的数据类型。因此,在您刷新或缓冲区已满之前,读取器流不会为您提供数据。

于 2012-09-12T13:14:43.747 回答