据我所知,从Java文件中读取基于字符的数据的两种最常见的方法是使用Scanner
或BufferedReader
。我也知道BufferedReader
通过使用缓冲区来避免物理磁盘操作来有效地读取文件。
我的问题是:
- 确实
Scanner
表现不如BufferedReader
? - 为什么你会选择
Scanner
在BufferedReader
反之亦然?
据我所知,从Java文件中读取基于字符的数据的两种最常见的方法是使用Scanner
或BufferedReader
。我也知道BufferedReader
通过使用缓冲区来避免物理磁盘操作来有效地读取文件。
我的问题是:
Scanner
表现不如BufferedReader
?Scanner
在BufferedReader
反之亦然?Answers:
在当前最新的JDK6版本/ build(b27)中,该Scanner
缓冲区具有较小的缓冲区(1024个字符),而缓冲区BufferedReader
(8192个字符)却足够了。
至于选择,Scanner
如果要解析文件,请使用,BufferedReader
如果要逐行读取文件,请使用。另请参阅其先前链接的API文档的介绍性文本。
nextXxx()
方法Scanner
。readInt();
readFloat(); 等等。现在有了解析的意思。而BalusC能否在聊天室中仅10分钟给我一点时间,我想问一下缓冲的原理。
BufferedReader
在Scanner的构造函数中包装了什么?这是一个好主意吗?
Scanner
的缓冲区将根据模式匹配的需要进行扩展。因此,如果您想要更大的缓冲区,则只需要在其上调用,例如findWithinHorizon("\\z", 8192)
,之后,它将使用容量为8192
chars 的缓冲区(如果小于,则使用整个文件)。
看到此链接,从那里引用以下内容:
BufferedReader是一个简单的类,旨在有效地从基础流中读取。通常,由读者(如FileReader)发出的每个读取请求都会导致对基础流做出相应的读取请求。每次调用read()或readLine()都可能导致从文件中读取字节,将其转换为字符,然后返回,这可能会非常低效。如果将Reader扭曲在BufferedReader中,则效率将得到显着提高。
BufferedReader是同步的,因此可以安全地从多个线程完成对BufferedReader的读取操作。
另一方面,扫描仪内置了更多奶酪。它可以完成BufferedReader可以完成的所有工作,并且效率也相同。但是,此外,扫描程序可以使用正则表达式为基本类型和字符串解析基础流。它还可以使用您选择的定界符标记基础流。它也可以不考虑定界符而对基础流进行正向扫描!
但是,扫描仪不是线程安全的,必须从外部进行同步。
如果要编写简单的日志阅读器,则使用BufferedReader或Scanner的选择取决于正在编写的代码。但是,如果您正在编写XML解析器,则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();
以下是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();
打印以下输出:
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:
从字符输入流中读取文本,缓冲字符,以便有效读取字符,数组和行。
可以指定缓冲区大小,也可以使用默认大小。对于大多数用途,默认值足够大。
通常,由读取器发出的每个读取请求都会导致对基础字符或字节流进行相应的读取请求。因此,建议将BufferedReader包裹在其read()操作可能会很昂贵的任何Reader上,例如FileReaders和InputStreamReaders。例如,
BufferedReader in
= new BufferedReader(new FileReader("foo.in"));
将缓冲来自指定文件的输入。如果不进行缓冲,则每次调用read()或readLine()都会导致从文件中读取字节,将其转换为字符,然后返回,这可能会非常低效。通过将每个DataInputStream替换为适当的BufferedReader,可以本地化使用DataInputStreams进行文本输入的程序。
资料来源:链接
有多种不同的方法可以在Java中进行输入,例如:
1)BufferedReader 2)扫描仪3)命令行参数
BufferedReader从字符输入流中读取文本,缓冲字符,以便有效读取字符,数组和行。
其中Scanner是一个简单的文本扫描程序,可以使用正则表达式解析原始类型和字符串。
如果您正在编写一个简单的日志读取器,那么带缓冲读取器就足够了。如果您正在编写XML解析器,则Scanner是更自然的选择。
有关更多信息,请参阅:
下面的答案来自 “从控制台读取”:JAVA Scanner与BufferedReader
从控制台读取输入时,有两个选项可以实现该目的。首先使用Scanner
,另一个使用BufferedReader
。他们两个都有不同的特征。这意味着如何使用它。
扫描程序将给定的输入视为令牌。BufferedReader只是逐行读取给定输入的字符串。它自己扫描程序提供解析功能,就像nextInt(),nextFloat()一样。
但是,其他之间有什么区别?
从JDK 1.5版开始,扫描仪自带。
什么时候应该使用扫描仪或缓冲读取器?
查看它们之间的主要区别,一个使用标记化,另一个使用流线。当您需要解析功能时,请改用Scanner。但是,我对BufferedReader更满意。当您需要读取文件时,请使用BufferedReader,因为它在读取文件时使用缓冲区。或者,您可以将BufferedReader用作Scanner的输入。