IT-Swarm.Net

扫描仪与BufferedReader

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

  • Scanner的表现和BufferedReader一样吗?
  • 你为什么选择Scanner而不是BufferedReader,反之亦然?
255
Mads Mobæk

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

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

186
Chandra Sekar S

在当前最新的JDK6发布/版本(b27)中, Scanner 具有较小的缓冲区( 1024个字符 )而不是 BufferedReader8192个字符 ),但它更多比不够。

至于选择,如果你想要 parse 文件,请使用Scanner,如果你想 读取 文件,请使用BufferedReader。另请参阅其上述API文档的介绍性文本。

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

看到这个 链接 ,从那里引用如下:

BufferedReader是一个简单的类,用于有效地从底层流中读取。通常,由读取器(如FileReader)构成的每个读取请求都会导致对基础流进行相应的读取请求。每次调用read()或readLine()都可能导致从文件中读取字节,转换为字符,然后返回,这可能是非常低效的。如果Reader在BufferedReader中变形,效率会明显提高。

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

另一方面,扫描仪内置了更多的奶酪;它可以完成BufferedReader可以做的所有事情,并且效率也相同。但是,另外,Scanner可以使用正则表达式解析基础流的基本类型和字符串。它还可以使用您选择的分隔符对基础流进行标记。它也可以对底层流进行前向扫描,而不考虑分隔符!

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

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

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

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

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

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

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

38
Sujith PS

我建议使用BufferedReader来阅读文本。 Scanner隐藏IOExceptionBufferedReader立即抛出它。

17
Evgeniy

BufferedReader Scanner 之间的区别如下:

  1. BufferedReader是 synchronized 但是Scanner是 不同步
  2. BufferedReader是 线程安全 但是Scanner是 不是线程安全的
  3. BufferedReader 具有更大的缓冲存储器 但Scanner 具有更小的缓冲存储器
  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
Raman Gupta

以下是BufferedReader和Scanner之间的区别

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

谢谢

7
dhS

主要差异: /

  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:

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

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

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

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

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

来源: Link

6
Shiva Nandam Sirmarigari

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

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

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

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

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

欲了解更多信息,请参阅:

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

3
manisha mulchandani

以下答案取自 从控制台读取:Java Scanner vs BufferedReader

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

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

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

  • 扫描仪将给定输入视为令牌。 BufferedReader作为流线/字符串
  • 扫描程序使用正则表达式给定输入标记。使用BufferedReader必须编写额外的代码
  • BufferedReader比Scanner *点快。 2
  • 扫描程序未同步,BufferedReader同步

扫描仪自JDK版本1.5以来随之而来。

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

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

1
KNU

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

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