可能重复: 扫描仪与BufferedReader
是否存在使用java.util.Scanner来读取某种输入的情况?在我的小测试中,我发现与java.util.Bufferedreader或从java.util.InputStreamReader实现自己的阅读器相比,它非常慢。
那我为什么要用扫描仪呢?
发布于 2012-09-12 12:30:33
Scanner类的主要用途是使用正则表达式解析原始类型和字符串的文本。您可以提供几种要读取的资源类型。
发布于 2012-09-12 12:30:09
来自文档
一个简单的文本扫描器,它可以使用正则表达式解析基本类型和字符串。
不会做BufferedReader的。
发布于 2012-09-12 12:42:24
虽然扫描仪速度相对较慢,但它往往足够快,而且比BufferedReader强大得多。
public static void main(String... args) throws IOException {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++)
sb.append("line: ").append(i).append("\n");
String lines = sb.toString();
for (int i = 0; i < 6; i++) {
testBufferedReader(lines);
testScanner(lines);
}
}
private static void testBufferedReader(String text) throws IOException {
int count = 0;
BufferedReader br = new BufferedReader(new StringReader(text));
long start = System.nanoTime();
while (br.readLine() != null)
count++;
long time = System.nanoTime() - start;
System.out.printf("BufferedReader.readLine() took an average of %,d ns count=%,d%n", time / count, count);
}
private static void testScanner(String text) throws IOException {
int count = 0;
Scanner sc = new Scanner(new StringReader(text));
long start = System.nanoTime();
while (sc.hasNextLine()) {
sc.nextLine();
count++;
}
long time = System.nanoTime() - start;
System.out.printf("Scanner nextLine took an average of %,d ns count=%,d%n", time / count, count);
}最后打印
BufferedReader.readLine() took an average of 124 ns count=10,000
Scanner nextLine took an average of 1,549 ns count=10,000虽然相对差异很大,但扫描仪每台不到几微秒.
https://stackoverflow.com/questions/12388154
复制相似问题