从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
吗?
答案 0 :(得分:6)
BufferedReader是一个有效读取的简单类 下属的溪流。通常,每个读取请求都由Reader构成 像FileReader一样会导致相应的读取请求 潜在的流。每次调用read()或readLine()都可能导致 要从文件中读取的字节,转换为字符,然后 返回,这可能是非常低效的。提高效率 如果Reader在BufferedReader中被扭曲,那么很明显 BufferedReader是同步的,因此对BufferedReader进行读操作 可以安全地从多个线程完成。
另一方面,扫描仪内置了更多的奶酪;它 可以做到BufferedReader可以做的所有事情,并在同一级别 效率也是如此。但是,另外一个Scanner可以解析 使用常规的基本类型和字符串的基础流 表达式。它还可以使用标记化基础流 您选择的分隔符。它也可以做前向扫描 基础流无视分隔符!然而,扫描仪是 不是线程安全的,它必须在外部同步。
答案 1 :(得分:4)
Scanner用于从流的内容中解析令牌,而BufferedReader只读取流并且不进行任何特殊的解析。
事实上,您可以将BufferedReader传递给扫描程序,因为要解析的字符源和BufferedReader是同步的而Scanner不是,所以由您决定。
编辑 System.in是一个流。
答案 2 :(得分:2)
主要的实际区别仅仅是Scanner直到1.5才被引入,因此在此之前你别无选择,只能将System.in
包围各种读者,然后自己解析输出以检索你想要什么。
Scanner现在为你管理了很多这样的事情,所以除非你有充分的理由使用BufferedReader并完全自己解析/处理事情,否则我通常默认使用Scanner - 如果没有别的,因为它使代码更清晰