从用户获取输入

4
什么是使用Scanner和BufferedReader获取输入的区别?
下面是一个BufferedReader的示例...
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Enter characters, 'q' to quit.");

// read characters
do {
    c = (char) br.read();
    System.out.println(c);
} while(c != 'q');

下面是一个Scanner示例...

Scanner scan = new Scanner(System.in);
char mrArray = new char[10];
// read characters
for (int i = 0; i < myArray.length; i++) {
    String temp = myScanner.next();
    myArray[i] = temp.charAt(0);
}

这两种情况有什么区别吗?这些类中是否有任何一个可能在未来被更改?我应该优先使用 BufferedStream 还是 Scanner

3个回答

6
一个 BufferedReader 是一个简单的类,旨在高效地从底层流中读取。通常,对于像 FileReader 这样的 Reader 的每个读取请求都会导致相应的读取请求发送到底层流。每次调用 read() 或 readLine() 都可能导致从文件中读取字节,将其转换为字符,然后返回,这可能非常低效。如果将 Reader 包装在 BufferedReader 中,则可以显着提高效率。
BufferedReader 是同步的,因此可以安全地从多个线程中进行 BufferedReader 上的读取操作。
另一方面,扫描仪具有更多内置的功能;它可以像 BufferedReader 一样执行所有操作,并且在相同的效率水平上执行。但是,除此之外,扫描仪还可以使用正则表达式解析基本类型和字符串的底层流。它还可以使用您选择的分隔符对底层流进行标记化。它还可以忽略分隔符对底层流进行前向扫描!但是,扫描仪不是线程安全的,必须进行外部同步。
来源:Scanner vs buffer reader

4

Scanner用于从流的内容中解析token,而BufferedReader仅读取流并不进行任何特殊的解析。

实际上,您可以将BufferedReader作为要解析的字符源传递给Scanner,而BufferedReader是同步的,而Scanner则不是,因此由您决定使用哪种方式。

编辑 System.in是一个流。


2
主要的实际区别就是在1.5之前没有Scanner,因此你只能将System.in包装在各种读取器中,然后自己解析输出以检索所需内容。
现在Scanner可以为您管理很多东西,因此除非您有充分的理由使用BufferedReader并完全自己解析/处理事物,否则我通常会默认使用Scanner - 至少因为它使代码更清晰。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接