为什么java.util.Scanner存在?

时间:2012-09-12 12:26:55

标签: java java.util.scanner

  

可能重复:
  Scanner vs. BufferedReader

是否有适合使用java.util.Scanner来读取某种输入的情况?在我的小测试中,我发现它比java.util.Bufferedreader或从java.util.InputStreamReader实现你自己的阅读器要慢得多。

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

5 个答案:

答案 0 :(得分:6)

来自docs

  

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

那不会做BufferedReader。

答案 1 :(得分:4)

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

答案 2 :(得分: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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

以下是java.lang.util.scannerjava.lang.util buffered reader之间的区别。虽然两者都可以在java类中从用户那里获取输入,但是需要了解一个显着的差异。

扫描仪是一个单一的令牌输入系统,它使用空格作为默认分隔符。虽然您可以使用其他各种方法将其更改为其他格式。

缓冲读卡器是缓冲输入系统。它接收数据块(流)然后输入用户想要存储的数据类型。因此,直到您刷新或缓冲区已满,读取器流将不会为您提供数据..