扫描仪与BufferedReader

时间:2010-02-09 18:17:22

标签: java file-io java.util.scanner bufferedreader

据我所知,从Java文件中读取基于字符的数据的两种最常用方法是使用ScannerBufferedReader。我也知道BufferedReader通过使用缓冲区来有效地读取文件以避免物理磁盘操作。我的问题是:

  • Scanner的效果是否与BufferedReader一样好?
  • 为什么选择Scanner而不是BufferedReader,反之亦然?

12 个答案:

答案 0 :(得分:186)

Scanner用于从流的内容解析标记,而BufferedReader只读取流并且不进行任何特殊的解析。

实际上,您可以将BufferedReader传递给scanner作为要解析的字符来源。

答案 1 :(得分:168)

在当前最新的JDK6发布/版本(b27)中,Scanner具有较小的缓冲区(1024 chars)而不是BufferedReader8192 chars),但它是绰绰有余。

关于选择,如果您要解析文件,请使用Scanner,如果您想要阅读,请使用BufferedReader文件逐行。另请参阅其上述API文档的介绍性文本。

  • 解析 =将给定输入解释为令牌(部分)。它能够直接以int,string,decimal等形式返回特定部分。另请参阅nextXxx()类中的所有Scanner方法。
  • 阅读 =哑流媒体。它不断回馈你所有的角色,你必须手动检查你是否想要匹配或组合有用的东西。但如果你不需要这样做,那么阅读就足够了。

答案 2 :(得分:76)

请参阅此link,其中引用了以下内容:

  

BufferedReader是一个简单的类,旨在有效地从中读取   下流。通常,每个读取请求都由一个读取器组成   FileReader导致相应的读取请求   潜在的流。每次调用read()或readLine()都可以   导致从文件中读取字节,转换为字符,和   然后返回,这可能是非常低效的。提高效率   如果Reader在BufferedReader中被扭曲,那就明显了。

     

BufferedReader是同步的,因此对BufferedReader进行读取操作   可以安全地从多个线程完成。

     

另一方面,扫描仪内置了更多的奶酪;它   可以做到BufferedReader可以做的所有事情,并在同一级别   效率也是如此。但是,另外一个Scanner可以解析   使用常规的基本类型和字符串的基础流   表达式。它还可以使用标记化基础流   您选择的分隔符。它也可以做前向扫描   不考虑分隔符的基础流!

     

然而,扫描仪不是线程安全的,它必须是外部的   同步。

     

使用BufferedReader或Scanner的选择取决于代码   你在写,如果你正在写一个简单的日志阅读器缓冲   读者就足够了。但是,如果您正在编写XML解析器扫描程序   是更自然的选择。

     

即使在读取输入时,如果想要接受用户输入行   并且说只需将它添加到文件中,BufferedReader就足够了。   另一方面,如果您想接受用户输入作为命令   多个选项,然后打算执行不同的操作   根据指定的命令和选项,扫描仪将适合   更好。

答案 3 :(得分:38)

  1. BufferedReader具有比Scanner大得多的缓冲区内存。如果要从流中获取长字符串,请使用BufferedReader;如果要从流中解析特定类型的令牌,请使用Scanner

  2. Scanner可以使用自定义分隔符使用tokenize并将流解析为原始数据类型,而BufferedReader只能读取和存储String。

  3. BufferedReader是同步的,而Scanner则不是。如果您正在处理多个线程,请使用BufferedReader

  4. Scanner隐藏IOException,而BufferedReader会立即抛出它。

答案 4 :(得分:17)

我建议使用BufferedReader来阅读文字。 Scanner隐藏IOException,而BufferedReader会立即投放。{/ p>

答案 5 :(得分:7)

以下是BufferedReader和Scanner之间的区别

  1. BufferedReader仅读取数据,但扫描程序也会解析数据。
  2. 你只能使用BufferedReader读取String,但你可以读取int, 长或使用扫描仪浮动。
  3. BufferedReader比Scanner更旧,它存在于jdk 1.1中 在JDK 5发行版中添加了扫描程序。
  4. 与1KB相比,BufferedReader的缓冲区大小很大(8KB) 扫描仪。
  5. BufferedReader更适合读取长String的文件 而Scanner更适合从中读取小用户输入 命令提示符。
  6. BufferedReader已同步但扫描程序未同步,这意味着您 不能在多个线程之间共享Scanner。
  7. BufferedReader比Scanner更快,因为它没有花时间 解析
  8. 与Scanner相比,BufferedReader快一点
  9. BufferedReader来自java.io包,Scanner来自java.util包 根据我们可以选择的要点。
  10. 由于

答案 6 :(得分:7)

BufferedReader 扫描程序的区别如下:

  1. BufferedReader 已同步但扫描程序未同步
  2. BufferedReader 线程安全但扫描程序非线程安全
  3. BufferedReader 具有更大的缓冲内存但是扫描器具有更小的缓冲内存
  4. BufferedReader 更快但是Scanner 执行速度更慢
  5. 从控制台读取一行的代码:

    <强>的BufferedReader

     InputStreamReader isr=new InputStreamReader(System.in);
     BufferedReader br= new BufferedReader(isr);
     String st= br.readLine();
    

    <强>扫描仪

    Scanner sc= new Scanner(System.in);
    String st= sc.nextLine();
    

答案 7 :(得分:6)

主要差异:

  1. 扫描
    • 一个简单的文本扫描程序,可以使用正则表达式解析基本类型和字符串。
    • 扫描程序使用分隔符模式将其输入分解为标记,分隔符模式默认匹配空格。然后可以使用各种下一种方法将得到的标记转换为不同类型的值。

    实施例

     String input = "1 fish 2 fish red fish blue fish";
     Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*");
     System.out.println(s.nextInt());
     System.out.println(s.nextInt());
     System.out.println(s.next());
     System.out.println(s.next());
     s.close(); 
    

    打印以下输出:

     1
     2
     red
     blue 
    

    使用此代码可以生成相同的输出,该代码使用正则表达式一次解析所有四个标记:

     String input = "1 fish 2 fish red fish blue fish";
    
     Scanner s = new Scanner(input);
     s.findInLine("(\\d+) fish (\\d+) fish (\\w+) fish (\\w+)");
     MatchResult result = s.match();
     for (int i=1; i<=result.groupCount(); i++)
         System.out.println(result.group(i));
     s.close(); `
    
    1. <强>的BufferedReader:

      • 从字符输入流中读取文本,缓冲字符,以便有效读取字符,数组和行。

      • 可以指定缓冲区大小,也可以使用默认大小。对于大多数用途,默认值足够大。

    2. 通常,由Reader构成的每个读取请求都会导致对基础字符或字节流进行相应的读取请求。因此,建议将BufferedReader包装在任何read()操作可能代价高昂的Reader上,例如FileReaders和InputStreamReaders。例如,

      BufferedReader in
         = new BufferedReader(new FileReader("foo.in"));
      

      将缓冲指定文件的输入。如果没有缓冲,read()或readLine()的每次调用都可能导致从文件中读取字节,转换为字符,然后返回,这可能是非常低效的。 使用DataInputStreams进行文本输入的程序可以通过用适当的BufferedReader替换每个DataInputStream来进行本地化。

      来源:Link

答案 8 :(得分:3)

在java中有不同的输入方式,如:

1)BufferedReader 2)扫描仪3)命令行参数

BufferedReader从字符输入流中读取文本,缓冲字符,以便有效读取字符,数组和行。

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

如果您正在编写简单的日志阅读器,则缓冲阅读器就足够了。如果您正在编写XML解析器,则扫描器是更自然的选择。

有关详细信息,请参阅:

http://java.meritcampus.com/t/240/Bufferedreader?tc=mm69

答案 9 :(得分:1)

以下答案取自Reading from Console: JAVA Scanner vs BufferedReader

从控制台读取输入时,有两个选项可以实现。首先使用Scanner,另一个使用BufferedReader。它们都有不同的特征。它意味着如何使用它。

扫描仪将输入视为令牌。 BufferedReader只是在输入为字符串的情况下逐行读取。扫描器它自己提供解析功能,就像nextInt(),nextFloat()。

但是,其他人之间的区别是什么?

  • 扫描仪在输入时作为令牌处理。 BufferedReader为stream line / String
  • 使用正则表达式给定输入标记的扫描仪。使用BufferedReader必须编写额外的代码
  • BufferedReader比Scanner * point no更快。 2
  • 扫描程序未同步,BufferedReader已同步

扫描仪自JDK版本1.5以后就开始使用。

什么时候应该使用Scanner或Buffered Reader?

看看它们之间的主要区别,一个使用标记化,另一个使用流线。当您需要解析功能时,请改用Scanner。但是,我对BufferedReader感到更舒服。当您需要从文件中读取时,请使用BufferedReader,因为它在读取文件时使用缓冲区。或者您可以使用BufferedReader作为Scanner的输入。

答案 10 :(得分:0)

  1. BufferedReader可能会为您提供更好的性能(因为Scanner基于InputStreamReader,看起源)。 ups,用于读取它使用nio的文件。当我针对大文件测试针对BufferedReader性能的nio性能时,nio显示出更好的性能。
  2. 从文件读取尝试Apache Commons IO。

答案 11 :(得分:0)

我更喜欢Scanner,因为它不会抛出已检查的异常,因此它的使用会产生更简化的代码。