扫描仪与BufferedReader

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

  • Scanner性能和BufferedReader吗?
  • 为什么要select通过BufferedReader Scanner ,反之亦然?

Scanner用于从stream的内容parsing令牌,而BufferedReader只是读取stream,不做任何特殊的parsing。

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

在目前最新的JDK6 release / build(b27)中,与BufferedReader ( 8192个字符 )相比, Scanner有一个更小的缓冲区( 1024个 字符 ),但这样做足够了。

至于select,如果你想分析文件使用Scanner如果你想逐行阅读文件,使用BufferedReader 。 另请参阅上述API文档的介绍性文字。

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

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

BufferedReader是同步的,所以BufferedReader上的读操作可以安全地从多个线程完成。

另一方面,扫描仪内置更多的奶酪。 它可以完成BufferedReader所能做的所有事情,并且效率也一样。 但是,另外一个扫描器可以使用正则expression式来分析原始types和string的底层stream。 它也可以使用您select的分隔符来标记基础stream。 它也可以对基本stream进行正向扫描,忽略分隔符!

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

如果您正在编写简单的日志读取器,使用BufferedReader或扫描器的select取决于您正在编写的代码缓冲读取器是足够的。 但是,如果你正在编写一个XMLparsing器,扫描器是更自然的select。

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

  1. BufferedReader器比扫描器有更大的缓冲存储器。 如果要从stream中获取长string,请使用BufferedReader如果要从stream中parsing特定types的标记,请使用Scanner

  2. Scanner可以使用自定义分隔符使用标记化,并将数据streamparsing为原始types的数据,而BufferedReader只能读取和存储string。

  3. BufferedReader是同步的,而Scanner不是。 如果使用multithreading,请使用BufferedReader

  4. ScannerBufferedReader立即抛出时隐藏IOException。

我build议使用BufferedReader来阅读文本。 ScannerBufferedReader立即抛出时隐藏IOException

Scanner类是Formater类的补充(用于将二进制数据转换为格式化文本)。 扫描仪读取格式化的input并将其转换为二进制forms。 尽pipe阅读格式化的input总是可以的,但是比大多数程序员所需要的花费更多。 由于增加了扫描仪,现在很容易读取所有types的数值,string和其他types的数据,无论是来自磁盘文件,键盘还是其他来源。 扫描仪可用于从控制台,文件,string或实现Readable接口或ReadableByteChannel的任何其他源读取input。 例如,您可以使用扫描仪从键盘上读取一个数字,并将其值赋给一个variables。

另一方面, BufferedReader是一个字符streamI / O类。 字符stream为字符(Unicode)提供了一种方便的input和输出方式。 BufferedReader主要用于从控制台System.in获取input。 它将InputStreamReader对象作为参数。

主要区别:

  1. 扫描器

  • 一个简单的文本扫描器,可以使用正则expression式分析原始types和string。
  • 扫描器使用分隔符模式将input分为令牌,缺省情况下符合空格。 然后可以使用各种下一种方法将得到的令牌转换为不同types的值。

  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 

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

  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中:

    • 从字符inputstream中读取文本,缓冲字符以便高效地读取字符,数组和行。

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

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

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

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

来源: 链接

  • BufferedReader是同步的,而Scanner不是。
  • 如果我们使用multithreading,则应该使用BufferedReader
  • BufferedReader器比Scanner有更大的缓冲存储器。
  • BufferedReader (8KB字节缓冲区)相比, Scanner有一个小缓冲区(1KB字符缓冲区),但这已经足够了。
  • BufferedReaderScanner快一点,因为Scanner分析input数据, BufferedReader只读取字符序列。

================================================== ======================

在java中有不同的方式来input:

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

BufferedReader从字符inputstream中读取文本,缓冲字符,以便高效地读取字符,数组和行。

Scanner是一个简单的文本扫描程序,它可以使用正则expression式来分析原始types和string。

如果你正在写一个简单的日志阅读器缓冲的阅读器是足够的。 如果你正在编写一个XMLparsing器,扫描器是更自然的select。

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

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

以下是BufferedReader和Scanner之间的区别

  1. BufferedReader只读取数据,但扫描器也parsing数据。
  2. 您只能使用BufferedReader读取string,但是您可以使用Scanner读取int,long或float。
  3. BufferedReader比Scanner旧,从JDK 1.1开始,而在JDK 5发行版中添加了Scanner。
  4. 与1KB的扫描仪相比,BufferedReader的缓冲区大小很大(8KB)。
  5. BufferedReader更适合读取长string的文件,而Scanner更适合从命令提示符读取小的用户input。
  6. BufferedReader是同步的,但是Scanner不是,这意味着你不能在多个线程之间共享扫描器。
  7. BufferedReader比Scanner快,因为它没有花时间分析
  8. 与Scanner相比,BufferedReader速度更快
  9. BufferedReader来自java.io包,Scanner来自java.util包,基于点我们可以select我们的select。

谢谢

下面的答案取自从控制台读取:JAVA扫描仪与BufferedReader

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

扫描仪将input视为令牌。 BufferedReader只是逐行读取给定的input作为string。 扫描仪自身提供parsing能力就像nextInt(),nextFloat()。

但是,别人之间有什么分别呢?

  • 扫描仪将input视为令牌。 BufferedReader作为stream行/string
  • 扫描仪使用正则expression式给定input。 使用BufferedReader必须写入额外的代码
  • BufferedReader比Scanner快*指向不。 2
  • 扫描仪不同步,BufferedReader同步

扫描仪自JDK版本1.5以上来。

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

看看他们之间的主要区别,一个使用标记化,另一个使用stream线。 当您需要parsingfunction时,请使用Scanner。 但是,我更喜欢BufferedReader。 当你需要从文件读取时,使用BufferedReader,因为它在读取文件时使用缓冲区。 或者你可以使用BufferedReader作为Scanner的input。

列出几个…

java.util.Scanner类是一个简单的文本扫描器,可以parsing原始types和string。 它在内部使用正则expression式来读取不同的types。

Java.io.BufferedReader类从字符inputstream中读取文本,缓冲字符以提供对字符序列的有效读取

1)当Scanner不是时, BufferedReader是同步的。 如果我们使用multithreading,则应该使用BufferedReader

2) BufferedReader器比Scanner有更大的缓冲存储器。 与BufferedReader (8KB字节缓冲区)相比, Scanner有一个小缓冲区(1KB字符缓冲区),但这已经足够了。

3) BufferedReaderScanner快一点,因为Scanner分析input数据,而BufferedReader只读取字符序列。

  1. BufferedReader可能会给你更好的性能(因为Scanner是基于InputStreamReader的,查看源代码)。 从使用nio的文件中读取。 当我testingNIO的性能与BufferedReader的性能对于大文件NIO显示出更好的性能。
  2. 从文件阅读Apache Commons IO。

我更喜欢Scanner因为它不会抛出检查exception,因此它的使用效果更加精简。

BufferedReaderScanner之间的区别如下:

  1. BufferedReader已同步,但Scanner 未同步
  2. BufferedReader是线程安全的,但扫描程序不是线程安全的
  3. 缓冲读取器具有较大的缓冲存储器,但是扫描器具有较小的缓冲存储器
  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();