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吗?

4

3 回答 3

6

BufferedReader 是一个简单的类,旨在有效地从底层流中读取。通常,由 Reader(如 FileReader)发出的每个读取请求都会导致对底层流发出相应的读取请求。每次调用 read() 或 readLine() 都可能导致从文件中读取字节,转换为字符,然后返回,这可能非常低效。如果 Reader 在 BufferedReader 中变形,效率会显着提高。
BufferedReader 是同步的,因此 BufferedReader 上的读取操作可以安全地从多个线程完成。

另一方面,扫描仪内置了更多的奶酪。它可以做 BufferedReader 可以做的所有事情,而且效率也相同。但是,除此之外,Scanner 可以使用正则表达式解析基本流的基本类型和字符串。它还可以使用您选择的分隔符标记基础流。它还可以不考虑分隔符对底层流进行前向扫描!然而,扫描器不是线程安全的,它必须是外部同步的。

资料来源:扫描仪与缓冲区阅读器

于 2012-04-17T13:40:20.350 回答
4

Scanner 用于从流的内容中解析令牌,而 BufferedReader 只是读取流并且不进行任何特殊解析。

实际上,您可以将 BufferedReader 作为要解析的字符源传递给扫描仪,并且 BufferedReader 是同步的,而 Scanner 不是,因此由您决定。

编辑System.in 是一个流。

于 2012-04-17T13:38:56.407 回答
2

主要的实际区别只是Scanner直到 1.5 才引入,因此在此之前您别无选择,只能包裹System.in各种阅读器,然后自己解析输出以检索您想要的内容。

Scanner 现在为您管理了很多这些,因此除非您有令人信服的理由使用 BufferedReader 并完全自己解析/处理事物,否则我通常会默认使用 Scanner - 如果没有别的,因为它使代码更清晰。

于 2012-04-17T13:41:50.833 回答