Mad*_*bæk 267 java file-io bufferedreader java.util.scanner
据我所知,从Java文件中读取基于字符的数据的两种最常用的方法是使用Scanner
或BufferedReader
.我也知道BufferedReader
通过使用缓冲区来有效地读取文件以避免物理磁盘操作.我的问题是:
Scanner
执行以及BufferedReader
?Scanner
,BufferedReader
反之亦然?Cha*_*kar 194
Scanner
用于从流的内容解析标记,而BufferedReader
只是读取流并且不进行任何特殊的解析.
实际上,您可以将a 作为要解析的字符源传递BufferedReader
给a scanner
.
Bal*_*usC 174
在目前最新的JDK6发布/版本(b27)中,Scanner
缓冲区(1024个字符)与BufferedReader
(8192个字符)相比有更小的缓冲区,但它已经绰绰有余了.
至于选择,使用Scanner
if你想解析文件,BufferedReader
如果你想逐行读取文件使用.另请参阅其上述API文档的介绍性文本.
nextXxx()
方法Scanner
.Jom*_*oos 77
看到这个链接,引用如下:
BufferedReader是一个简单的类,用于有效地从底层流中读取.通常,由读取器(如FileReader)构成的每个读取请求都会导致对基础流进行相应的读取请求.每次调用read()或readLine()都可能导致从文件中读取字节,转换为字符,然后返回,这可能是非常低效的.如果Reader在BufferedReader中变形,效率会明显提高.
BufferedReader是同步的,因此可以安全地从多个线程完成对BufferedReader的读取操作.
另一方面,扫描仪内置了更多的奶酪; 它可以完成BufferedReader可以做的所有事情,并且效率也相同.但是,另外,Scanner可以使用正则表达式解析基础流的基本类型和字符串.它还可以使用您选择的分隔符对基础流进行标记.它也可以对底层流进行前向扫描,而不考虑分隔符!
然而,扫描仪不是线程安全的,它必须在外部同步.
使用BufferedReader或扫描仪的选择取决于您编写的代码,如果您正在编写简单的日志读取器,则缓冲读取器就足够了.但是,如果您正在编写XML解析器,则扫描器是更自然的选择.
即使在读取输入时,如果想逐行接受用户输入并说只需将其添加到文件中,BufferedReader就足够了.另一方面,如果您希望将用户输入作为具有多个选项的命令接受,然后打算根据指定的命令和选项执行不同的操作,则扫描程序将更适合.
Suj*_* PS 40
BufferedReader
具有比Scanner大得多的缓冲存储器.使用BufferedReader
,如果你想从流中获得长字符串,然后使用Scanner
,如果你想从流分析特定类型的令牌.
Scanner
可以使用自定义分隔符使用tokenize并将流解析为原始类型的数据,同时BufferedReader
只能读取和存储String.
BufferedReader
是同步而Scanner
不是.使用BufferedReader
,如果你正在使用多线程工作.
Scanner
隐藏IOException,同时BufferedReader
立即抛出它.
Ram*_*pta 11
BufferedReader和Scanner之间的区别如下:
从控制台读取一行的代码:
BufferedReader:
InputStreamReader isr=new InputStreamReader(System.in);
BufferedReader br= new BufferedReader(isr);
String st= br.readLine();
Run Code Online (Sandbox Code Playgroud)
扫描仪:
Scanner sc= new Scanner(System.in);
String st= sc.nextLine();
Run Code Online (Sandbox Code Playgroud)以下是BufferedReader和Scanner之间的区别
谢谢
主要差异:
例
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();
Run Code Online (Sandbox Code Playgroud)
打印以下输出:
1
2
red
blue
Run Code Online (Sandbox Code Playgroud)
使用此代码可以生成相同的输出,该代码使用正则表达式一次解析所有四个标记:
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(); `
Run Code Online (Sandbox Code Playgroud)
BufferedReader中:
从字符输入流中读取文本,缓冲字符,以便有效地读取字符,数组和行.
可以指定缓冲区大小,或者可以使用默认大小.对于大多数用途,默认值足够大.
通常,由Reader构成的每个读取请求都会导致相应的读取请求由基础字符或字节流构成.因此,建议将BufferedReader包装在任何read()操作可能代价高昂的Reader上,例如FileReaders和InputStreamReaders.例如,
BufferedReader in
= new BufferedReader(new FileReader("foo.in"));
Run Code Online (Sandbox Code Playgroud)
将缓冲指定文件的输入.如果没有缓冲,read()或readLine()的每次调用都可能导致从文件中读取字节,转换为字符,然后返回,这可能是非常低效的.使用DataInputStreams进行文本输入的程序可以通过用适当的BufferedReader替换每个DataInputStream来进行本地化.
来源:链接
归档时间: |
|
查看次数: |
245483 次 |
最近记录: |