扫描仪与BufferedReader
据我所知,从Java文件中读取基于字符的数据的两种最常见的方法是使用Scanner
或BufferedReader
。 我也知道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作为具有多个选项的命令,然后打算根据指定的命令和选项执行不同的操作,扫描仪将更适合。
-
BufferedReader
器比扫描器有更大的缓冲存储器。 如果要从stream中获取长string,请使用BufferedReader
如果要从stream中parsing特定types的标记,请使用Scanner
。 -
Scanner
可以使用自定义分隔符使用标记化,并将数据streamparsing为原始types的数据,而BufferedReader
只能读取和存储string。 -
BufferedReader
是同步的,而Scanner
不是。 如果使用multithreading,请使用BufferedReader
。 -
Scanner
在BufferedReader
立即抛出时隐藏IOException。
我build议使用BufferedReader
来阅读文本。 Scanner
在BufferedReader
立即抛出时隐藏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对象作为参数。
主要区别:
- 扫描器
- 一个简单的文本扫描器,可以使用正则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(); `
-
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字符缓冲区),但这已经足够了。 -
BufferedReader
比Scanner
快一点,因为Scanner
分析input数据,BufferedReader
只读取字符序列。
================================================== ======================
在java中有不同的方式来input:
1)BufferedReader 2)扫描器3)命令行参数
BufferedReader从字符inputstream中读取文本,缓冲字符,以便高效地读取字符,数组和行。
Scanner是一个简单的文本扫描程序,它可以使用正则expression式来分析原始types和string。
如果你正在写一个简单的日志阅读器缓冲的阅读器是足够的。 如果你正在编写一个XMLparsing器,扫描器是更自然的select。
欲了解更多信息,请参阅:
以下是BufferedReader和Scanner之间的区别
- BufferedReader只读取数据,但扫描器也parsing数据。
- 您只能使用BufferedReader读取string,但是您可以使用Scanner读取int,long或float。
- BufferedReader比Scanner旧,从JDK 1.1开始,而在JDK 5发行版中添加了Scanner。
- 与1KB的扫描仪相比,BufferedReader的缓冲区大小很大(8KB)。
- BufferedReader更适合读取长string的文件,而Scanner更适合从命令提示符读取小的用户input。
- BufferedReader是同步的,但是Scanner不是,这意味着你不能在多个线程之间共享扫描器。
- BufferedReader比Scanner快,因为它没有花时间分析
- 与Scanner相比,BufferedReader速度更快
- 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) BufferedReader
比Scanner
快一点,因为Scanner
分析input数据,而BufferedReader
只读取字符序列。
-
BufferedReader可能会给你更好的性能(因为Scanner是基于InputStreamReader的,查看源代码)。从使用nio的文件中读取。 当我testingNIO的性能与BufferedReader的性能对于大文件NIO显示出更好的性能。 - 从文件阅读Apache Commons IO。
我更喜欢Scanner
因为它不会抛出检查exception,因此它的使用效果更加精简。
BufferedReader和Scanner之间的区别如下:
- BufferedReader已同步,但Scanner 未同步 。
- BufferedReader是线程安全的,但扫描程序不是线程安全的 。
- 缓冲读取器具有较大的缓冲存储器,但是扫描器具有较小的缓冲存储器 。
- BufferedReader 速度更快,但Scanner 执行速度更慢 。
-
从控制台读取一行的代码:
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();