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(); `
12条答案
按热度按时间ut6juiuv1#
请参阅此链接,以下内容引自此处:
bufferedreader是一个简单的类,用于有效地从下划线流中读取数据。通常,像filereader这样的读取器发出的每个读取请求都会导致对底层流发出相应的读取请求。每次调用read()或readline()都可能导致从文件中读取字节,转换为字符,然后返回,这可能非常低效。如果读卡器在缓冲读卡器中扭曲,效率会显著提高。
bufferedreader是同步的,因此可以从多个线程安全地执行bufferedreader上的读取操作。
另一方面,扫描仪内置了更多的奶酪;它可以完成bufferedreader所能做的所有事情,并且具有相同的效率。但是,另外,扫描器可以使用正则表达式解析基本类型和字符串的底层流。它还可以用您选择的分隔符标记底层流。它还可以对底层流进行前向扫描,而不考虑分隔符!
然而,扫描仪不是线程安全的,它必须在外部同步。
使用bufferedreader或scanner的选择取决于您正在编写的代码,如果您正在编写简单的日志读取器,则使用bufferedreader就足够了。但是,如果您正在编写一个xml解析器,那么扫描器是更自然的选择。
即使在读取输入时,如果希望逐行接受用户输入并说只需将其添加到文件中,bufferedreader就足够了。另一方面,如果您希望将用户输入作为具有多个选项的命令来接受,然后打算根据指定的命令和选项执行不同的操作,那么扫描仪将更适合您。
yhived7q2#
BufferedReader
具有比扫描仪大得多的缓冲存储器。使用BufferedReader
如果要从流中获取长字符串,请使用Scanner
如果您想从流中解析特定类型的令牌。Scanner
可以使用自定义分隔符进行标记化,并将流解析为原始类型的数据,而BufferedReader
只能读取和存储字符串。BufferedReader
是同步的,而Scanner
不是。使用BufferedReader
如果您使用多个线程。Scanner
隐藏ioexception whileBufferedReader
马上扔掉。zte4gxcn3#
java中有不同的输入方式,如:
1) bufferedreader 2)scanner 3)命令行参数
bufferedreader从字符输入流中读取文本,对字符进行缓冲,以便有效地读取字符、数组和行。
其中scanner是一个简单的文本扫描器,它可以使用正则表达式解析原语类型和字符串。
如果您正在编写一个简单的日志读取器,缓冲读取器就足够了。如果您正在编写一个xml解析器,那么扫描器是更自然的选择。
更多信息请参考:
http://java.meritcampus.com/t/240/bufferedreader?tc=mm69
6tqwzwtp4#
以下是bufferedreader和scanner之间的区别
bufferedreader只读取数据,而scanner也解析数据。
只能使用bufferedreader读取字符串,但可以使用scanner读取int、long或float。
bufferedreader在scanner中较旧,它存在于JDK1.1中,而scanner是在JDK5版本中添加的。
bufferedreader的缓冲区大小比扫描仪的1kb大(8kb)。
bufferedreader更适合读取长字符串文件,而scanner更适合从命令提示符读取小用户输入。
bufferedreader已同步,但scanner未同步,这意味着您不能在多个线程之间共享scanner。
bufferedreader比scanner更快,因为它不花时间进行解析
bufferedreader比scanner快一点
bufferedreader来自java.io包,scanner来自java.util包,根据我们可以选择的点。
谢谢
kadbb4595#
bufferedreader可能会提供更好的性能(因为scanner基于inputstreamreader,look源)。ups使用nio读取文件。当我用大文件的bufferedreader性能测试nio性能时,nio显示出更好的性能。
要读取文件,请尝试apachecommons io。
8ftvxx2r6#
在当前最新的jdk6发布/构建(b27)中
Scanner
具有较小的缓冲区(1024个字符),而不是BufferedReader
(8192个字符),但已经足够了。至于选择,使用
Scanner
如果要分析文件,请使用BufferedReader
如果你想逐行读取文件。另请参阅他们之前链接的api文档的介绍性文本。解析=将给定的输入解释为标记(部分)。它能够直接返回特定的部分,如int、string、decimal等,也可以看到所有这些
nextXxx()
中的方法Scanner
班级。读取=哑流。它不断地返回给你所有的字符,如果你想匹配或合成一些有用的东西,你就必须手动检查这些字符。但如果你不需要这样做,那么阅读就足够了。
aemubtdh7#
Scanner
用于在BufferedReader
只读取流,不做任何特殊的解析。事实上你可以通过考试
BufferedReader
到scanner
作为要解析的字符源。blmhpbnm8#
我建议用
BufferedReader
用于阅读文本。Scanner
兽皮IOException
而BufferedReader
马上扔掉。67up9zun9#
我更喜欢
Scanner
因为它不会抛出选中的异常,因此它的使用会导致更精简的代码。azpvetkf10#
下面的答案来自console:java scanner vs bufferedreader
当从控制台读取输入时,有两个选项可以实现这一点。首次使用
Scanner
,另一个使用BufferedReader
. 两者都有不同的特点。它意味着如何使用它。扫描器将给定的输入视为令牌。bufferedreader只是将给定的输入作为字符串逐行读取。scanner-it提供了像nextint()、nextfloat()一样的解析功能。
但是,其他人之间有什么不同呢?
扫描器将给定的输入视为令牌。bufferedreader作为流行/string
scanner使用regex标记给定的输入。使用bufferedreader必须编写额外的代码
bufferedreader比scanner*点2快
扫描仪未同步,bufferedreader已同步
自jdk 1.5版更高版本以来,扫描仪一直在使用。
什么时候应该使用扫描仪,或缓冲阅读器?
看看它们之间的主要区别,一个使用标记化,另一个使用流行。当您需要解析功能时,请改用scanner。但是,我更喜欢bufferedreader。当您需要读取文件时,请使用bufferedreader,因为它在读取文件时使用buffer。或者可以使用bufferedreader作为扫描仪的输入。
tcomlyy611#
主要区别:
扫描仪
一个简单的文本扫描器,可以使用正则表达式解析原语类型和字符串。
扫描器使用定界符模式将其输入分解为标记,默认情况下,定界符模式匹配空白。然后可以使用各种next方法将得到的令牌转换为不同类型的值。
例子
打印以下输出:
此代码可以生成相同的输出,它使用正则表达式一次解析所有四个标记:
缓冲读取器:
从字符输入流中读取文本,对字符进行缓冲,以便有效地读取字符、数组和行。
可以指定缓冲区大小,也可以使用默认大小。默认值对于大多数情况都足够大。
通常,读取器发出的每个读取请求都会导致对底层字符或字节流发出相应的读取请求。因此,建议将bufferedreader Package 在任何read()操作可能代价高昂的读取器(如filereaders和inputstreamreaders)周围。例如,
将缓冲指定文件的输入。在没有缓冲的情况下,每次调用read()或readline()都可能导致从文件中读取字节,转换为字符,然后返回,这可能非常低效。使用datainputstreams进行文本输入的程序可以通过用适当的bufferedreader替换每个datainputstream来本地化。
source:link
vjhs03f712#
bufferedreader和scanner的区别如下:
bufferedreader已同步,但扫描仪未同步。
bufferedreader是线程安全的,但scanner不是线程安全的。
bufferedreader具有较大的缓冲内存,但scanner具有较小的缓冲内存。
bufferedreader执行速度更快,但scanner执行速度较慢。
从控制台读取行的代码:
缓冲读取器:
扫描仪: