为什么会有java.util.Scanner存在?

3

可能是重复问题:
Scanner vs. BufferedReader

在什么情况下使用java.util.Scanner来读取某种类型的输入是合适的?在我的小测试中,与java.util.Bufferedreader或实现自己的java.util.InputStreamReader读取器相比,我发现它非常慢。

那么,有没有任何理由我想使用Scanner呢?


1
奇怪。我通常会问自己为什么不使用扫描器。 - UmNyobe
5个回答

6

根据文档

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

但这不能满足BufferedReader的需求。


只是补充一下,Scanner不是线程安全的,但比BufferReader更强大。它内置了更多的功能。 - amod

4
< p > Scanner类的主要目的是使用正则表达式解析文本中的基本类型和字符串。您可以提供多种资源类型进行读取。< /p >

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

相对差异虽然很大,但扫描仪每次的时间少于几微秒。


0
Scanner- 其中许多方法的想法是将输入流解析为标记。 BufferedReader 不依赖于将其输入分解为标记。它允许您按字符读取,如果需要,可以读取整行并让您自己处理。
将 Scanner 与之结合使用; 它可以像 BufferedReader 一样高效地完成所有工作。但是,除此之外,Scanner 还可以使用正则表达式解析基本类型和字符串的底层流。它还可以使用您选择的分隔符对底层流进行标记化。它还可以在忽略分隔符的情况下向前扫描底层流!
编辑只是忘记提到... “然而,Scanner 不是线程安全的,必须进行外部同步。”

0

这里介绍了java.lang.util.scannerjava.lang.util buffered reader之间的区别。虽然两者都在Java类中用于从用户处获取输入,但是有一个显著的差异需要理解。

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

而Buffered Reader是缓冲输入系统。它接收数据块(流),然后将其馈送到用户想要存储的数据类型中。因此,在刷新或缓冲区已满之前,读取器流不会提供数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接