scanner与bufferedreader之比较

jc3wubiy  于 2021-06-30  发布在  Java
关注(0)|答案(12)|浏览(445)

据我所知,在java中从文件中读取基于字符的数据的两种最常见的方法是 Scanner 或者 BufferedReader . 我也知道 BufferedReader 通过使用缓冲区有效地读取文件,以避免物理磁盘操作。
我的问题是:
Scanner 表现得和 BufferedReader ?
你为什么要选择 Scanner 结束 BufferedReader 反之亦然?

ut6juiuv

ut6juiuv1#

请参阅此链接,以下内容引自此处:
bufferedreader是一个简单的类,用于有效地从下划线流中读取数据。通常,像filereader这样的读取器发出的每个读取请求都会导致对底层流发出相应的读取请求。每次调用read()或readline()都可能导致从文件中读取字节,转换为字符,然后返回,这可能非常低效。如果读卡器在缓冲读卡器中扭曲,效率会显著提高。
bufferedreader是同步的,因此可以从多个线程安全地执行bufferedreader上的读取操作。
另一方面,扫描仪内置了更多的奶酪;它可以完成bufferedreader所能做的所有事情,并且具有相同的效率。但是,另外,扫描器可以使用正则表达式解析基本类型和字符串的底层流。它还可以用您选择的分隔符标记底层流。它还可以对底层流进行前向扫描,而不考虑分隔符!
然而,扫描仪不是线程安全的,它必须在外部同步。
使用bufferedreader或scanner的选择取决于您正在编写的代码,如果您正在编写简单的日志读取器,则使用bufferedreader就足够了。但是,如果您正在编写一个xml解析器,那么扫描器是更自然的选择。
即使在读取输入时,如果希望逐行接受用户输入并说只需将其添加到文件中,bufferedreader就足够了。另一方面,如果您希望将用户输入作为具有多个选项的命令来接受,然后打算根据指定的命令和选项执行不同的操作,那么扫描仪将更适合您。

yhived7q

yhived7q2#

BufferedReader 具有比扫描仪大得多的缓冲存储器。使用 BufferedReader 如果要从流中获取长字符串,请使用 Scanner 如果您想从流中解析特定类型的令牌。 Scanner 可以使用自定义分隔符进行标记化,并将流解析为原始类型的数据,而 BufferedReader 只能读取和存储字符串。 BufferedReader 是同步的,而 Scanner 不是。使用 BufferedReader 如果您使用多个线程。 Scanner 隐藏ioexception while BufferedReader 马上扔掉。

zte4gxcn

zte4gxcn3#

java中有不同的输入方式,如:
1) bufferedreader 2)scanner 3)命令行参数
bufferedreader从字符输入流中读取文本,对字符进行缓冲,以便有效地读取字符、数组和行。
其中scanner是一个简单的文本扫描器,它可以使用正则表达式解析原语类型和字符串。
如果您正在编写一个简单的日志读取器,缓冲读取器就足够了。如果您正在编写一个xml解析器,那么扫描器是更自然的选择。
更多信息请参考:
http://java.meritcampus.com/t/240/bufferedreader?tc=mm69

6tqwzwtp

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包,根据我们可以选择的点。
谢谢

kadbb459

kadbb4595#

bufferedreader可能会提供更好的性能(因为scanner基于inputstreamreader,look源)。ups使用nio读取文件。当我用大文件的bufferedreader性能测试nio性能时,nio显示出更好的性能。
要读取文件,请尝试apachecommons io。

8ftvxx2r

8ftvxx2r6#

在当前最新的jdk6发布/构建(b27)中 Scanner 具有较小的缓冲区(1024个字符),而不是 BufferedReader (8192个字符),但已经足够了。
至于选择,使用 Scanner 如果要分析文件,请使用 BufferedReader 如果你想逐行读取文件。另请参阅他们之前链接的api文档的介绍性文本。
解析=将给定的输入解释为标记(部分)。它能够直接返回特定的部分,如int、string、decimal等,也可以看到所有这些 nextXxx() 中的方法 Scanner 班级。
读取=哑流。它不断地返回给你所有的字符,如果你想匹配或合成一些有用的东西,你就必须手动检查这些字符。但如果你不需要这样做,那么阅读就足够了。

aemubtdh

aemubtdh7#

Scanner 用于在 BufferedReader 只读取流,不做任何特殊的解析。
事实上你可以通过考试 BufferedReaderscanner 作为要解析的字符源。

blmhpbnm

blmhpbnm8#

我建议用 BufferedReader 用于阅读文本。 Scanner 兽皮 IOExceptionBufferedReader 马上扔掉。

67up9zun

67up9zun9#

我更喜欢 Scanner 因为它不会抛出选中的异常,因此它的使用会导致更精简的代码。

azpvetkf

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作为扫描仪的输入。

tcomlyy6

tcomlyy611#

主要区别:
扫描仪
一个简单的文本扫描器,可以使用正则表达式解析原语类型和字符串。
扫描器使用定界符模式将其输入分解为标记,默认情况下,定界符模式匹配空白。然后可以使用各种next方法将得到的令牌转换为不同类型的值。
例子

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(); `

缓冲读取器:
从字符输入流中读取文本,对字符进行缓冲,以便有效地读取字符、数组和行。
可以指定缓冲区大小,也可以使用默认大小。默认值对于大多数情况都足够大。
通常,读取器发出的每个读取请求都会导致对底层字符或字节流发出相应的读取请求。因此,建议将bufferedreader Package 在任何read()操作可能代价高昂的读取器(如filereaders和inputstreamreaders)周围。例如,

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

将缓冲指定文件的输入。在没有缓冲的情况下,每次调用read()或readline()都可能导致从文件中读取字节,转换为字符,然后返回,这可能非常低效。使用datainputstreams进行文本输入的程序可以通过用适当的bufferedreader替换每个datainputstream来本地化。
source:link

vjhs03f7

vjhs03f712#

bufferedreader和scanner的区别如下:
bufferedreader已同步,但扫描仪未同步。
bufferedreader是线程安全的,但scanner不是线程安全的。
bufferedreader具有较大的缓冲内存,但scanner具有较小的缓冲内存。
bufferedreader执行速度更快,但scanner执行速度较慢。
从控制台读取行的代码:
缓冲读取器:

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();

相关问题