可能是重复问题:
Scanner vs. BufferedReader
在什么情况下使用java.util.Scanner来读取某种类型的输入是合适的?在我的小测试中,与java.util.Bufferedreader或实现自己的java.util.InputStreamReader读取器相比,我发现它非常慢。
那么,有没有任何理由我想使用Scanner呢?
可能是重复问题:
Scanner vs. BufferedReader
在什么情况下使用java.util.Scanner来读取某种类型的输入是合适的?在我的小测试中,与java.util.Bufferedreader或实现自己的java.util.InputStreamReader读取器相比,我发现它非常慢。
那么,有没有任何理由我想使用Scanner呢?
尽管Scanner相对较慢,但通常它已经足够快了,并且比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
相对差异虽然很大,但扫描仪每次的时间少于几微秒。
这里介绍了java.lang.util.scanner
和java.lang.util buffered reader
之间的区别。虽然两者都在Java类中用于从用户处获取输入,但是有一个显著的差异需要理解。
Scanner是单个标记输入系统,使用空格作为默认分隔符。尽管您可以使用各种其他方法将其更改为其他格式。
而Buffered Reader是缓冲输入系统。它接收数据块(流),然后将其馈送到用户想要存储的数据类型中。因此,在刷新或缓冲区已满之前,读取器流不会提供数据。