据我所知,从Java文件中读取基于字符的数据的两种最常用方法是使用Scanner
或BufferedReader
。我也知道BufferedReader
通过使用缓冲区来有效地读取文件以避免物理磁盘操作。我的问题是:
Scanner
的效果是否与BufferedReader
一样好?Scanner
而不是BufferedReader
,反之亦然?答案 0 :(得分:186)
Scanner
用于从流的内容解析标记,而BufferedReader
只读取流并且不进行任何特殊的解析。
实际上,您可以将BufferedReader
传递给scanner
作为要解析的字符来源。
答案 1 :(得分:168)
在当前最新的JDK6发布/版本(b27)中,Scanner
具有较小的缓冲区(1024 chars)而不是BufferedReader
(8192 chars),但它是绰绰有余。
关于选择,如果您要解析文件,请使用Scanner
,如果您想要阅读,请使用BufferedReader
文件逐行。另请参阅其上述API文档的介绍性文本。
nextXxx()
类中的所有Scanner
方法。 答案 2 :(得分:76)
请参阅此link,其中引用了以下内容:
BufferedReader是一个简单的类,旨在有效地从中读取 下流。通常,每个读取请求都由一个读取器组成 FileReader导致相应的读取请求 潜在的流。每次调用read()或readLine()都可以 导致从文件中读取字节,转换为字符,和 然后返回,这可能是非常低效的。提高效率 如果Reader在BufferedReader中被扭曲,那就明显了。
BufferedReader是同步的,因此对BufferedReader进行读取操作 可以安全地从多个线程完成。
另一方面,扫描仪内置了更多的奶酪;它 可以做到BufferedReader可以做的所有事情,并在同一级别 效率也是如此。但是,另外一个Scanner可以解析 使用常规的基本类型和字符串的基础流 表达式。它还可以使用标记化基础流 您选择的分隔符。它也可以做前向扫描 不考虑分隔符的基础流!
然而,扫描仪不是线程安全的,它必须是外部的 同步。
使用BufferedReader或Scanner的选择取决于代码 你在写,如果你正在写一个简单的日志阅读器缓冲 读者就足够了。但是,如果您正在编写XML解析器扫描程序 是更自然的选择。
即使在读取输入时,如果想要接受用户输入行 并且说只需将它添加到文件中,BufferedReader就足够了。 另一方面,如果您想接受用户输入作为命令 多个选项,然后打算执行不同的操作 根据指定的命令和选项,扫描仪将适合 更好。
答案 3 :(得分:38)
BufferedReader
具有比Scanner大得多的缓冲区内存。如果要从流中获取长字符串,请使用BufferedReader
;如果要从流中解析特定类型的令牌,请使用Scanner
。
Scanner
可以使用自定义分隔符使用tokenize并将流解析为原始数据类型,而BufferedReader
只能读取和存储String。
BufferedReader
是同步的,而Scanner
则不是。如果您正在处理多个线程,请使用BufferedReader
。
Scanner
隐藏IOException,而BufferedReader
会立即抛出它。
答案 4 :(得分:17)
我建议使用BufferedReader
来阅读文字。 Scanner
隐藏IOException
,而BufferedReader
会立即投放。{/ p>
答案 5 :(得分:7)
以下是BufferedReader和Scanner之间的区别
由于
答案 6 :(得分:7)
BufferedReader 与扫描程序的区别如下:
从控制台读取一行的代码:
<强>的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 :(得分:6)
主要差异:
实施例
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:强>
从字符输入流中读取文本,缓冲字符,以便有效读取字符,数组和行。
可以指定缓冲区大小,也可以使用默认大小。对于大多数用途,默认值足够大。
通常,由Reader构成的每个读取请求都会导致对基础字符或字节流进行相应的读取请求。因此,建议将BufferedReader包装在任何read()操作可能代价高昂的Reader上,例如FileReaders和InputStreamReaders。例如,
BufferedReader in
= new BufferedReader(new FileReader("foo.in"));
将缓冲指定文件的输入。如果没有缓冲,read()或readLine()的每次调用都可能导致从文件中读取字节,转换为字符,然后返回,这可能是非常低效的。 使用DataInputStreams进行文本输入的程序可以通过用适当的BufferedReader替换每个DataInputStream来进行本地化。
来源:Link
答案 8 :(得分:3)
在java中有不同的输入方式,如:
1)BufferedReader 2)扫描仪3)命令行参数
BufferedReader从字符输入流中读取文本,缓冲字符,以便有效读取字符,数组和行。
其中Scanner是一个简单的文本扫描程序,可以使用正则表达式解析基本类型和字符串。
如果您正在编写简单的日志阅读器,则缓冲阅读器就足够了。如果您正在编写XML解析器,则扫描器是更自然的选择。
有关详细信息,请参阅:
答案 9 :(得分:1)
以下答案取自Reading from Console: JAVA Scanner vs BufferedReader
从控制台读取输入时,有两个选项可以实现。首先使用Scanner
,另一个使用BufferedReader
。它们都有不同的特征。它意味着如何使用它。
扫描仪将输入视为令牌。 BufferedReader只是在输入为字符串的情况下逐行读取。扫描器它自己提供解析功能,就像nextInt(),nextFloat()。
但是,其他人之间的区别是什么?
扫描仪自JDK版本1.5以后就开始使用。
什么时候应该使用Scanner或Buffered Reader?
看看它们之间的主要区别,一个使用标记化,另一个使用流线。当您需要解析功能时,请改用Scanner。但是,我对BufferedReader感到更舒服。当您需要从文件中读取时,请使用BufferedReader,因为它在读取文件时使用缓冲区。或者您可以使用BufferedReader作为Scanner的输入。
答案 10 :(得分:0)
答案 11 :(得分:0)
我更喜欢Scanner
,因为它不会抛出已检查的异常,因此它的使用会产生更简化的代码。