从用户那里获取输入

时间:2012-04-17 13:37:13

标签: java io

ScannerBufferedReader获取输入有什么区别?

这是一个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 个答案:

答案 0 :(得分:6)

  

BufferedReader是一个有效读取的简单类   下属的溪流。通常,每个读取请求都由Reader构成   像FileReader一样会导致相应的读取请求   潜在的流。每次调用read()或readLine()都可能导致   要从文件中读取的字节,转换为字符,然后   返回,这可能是非常低效的。提高效率   如果Reader在BufferedReader中被扭曲,那么很明显   BufferedReader是同步的,因此对BufferedReader进行读操作   可以安全地从多个线程完成。

     

另一方面,扫描仪内置了更多的奶酪;它   可以做到BufferedReader可以做的所有事情,并在同一级别   效率也是如此。但是,另外一个Scanner可以解析   使用常规的基本类型和字符串的基础流   表达式。它还可以使用标记化基础流   您选择的分隔符。它也可以做前向扫描   基础流无视分隔符!然而,扫描仪是   不是线程安全的,它必须在外部同步。

来源:Scanner vs buffer reader

答案 1 :(得分:4)

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

事实上,您可以将BufferedReader传递给扫描程序,因为要解析的字符源和BufferedReader是同步的而Scanner不是,所以由您决定。

编辑 System.in是一个流。

答案 2 :(得分:2)

主要的实际区别仅仅是Scanner直到1.5才被引入,因此在此之前你别无选择,只能将System.in包围各种读者,然后自己解析输出以检索你想要什么。

Scanner现在为你管理了很多这样的事情,所以除非你有充分的理由使用BufferedReader并完全自己解析/处理事情,否则我通常默认使用Scanner - 如果没有别的,因为它使代码更清晰