0

对于从STDIN读取输入,我总是使用Scanner对象。最近我读了BufferedInputStreamhere表示BufferedInputStream是读取输入的最快方式。在Scanner我们有各种方法(读integernextInt(),读byte nextByte(),读string next()等) 目前我正在阅读一些字符串(最大100000个字符)和一些整数。根据这些整数,我进一步运行我的for循环,该输入来自STDIN。下面是我用,直到NOW-使用BufferedInputStream在扫描仪的就位时面临困难

Scanner sc = new Scanner(System.in); 
    int numOfStr = sc.nextInt(); 
    String inputStr[] = new String[numOfStr]; 
     for (int i = 0; i < numOfStr; i++) { 
       inputStr[i] = sc.next(); 
     } 
    } 

然而,随着BufferedInputStream的代码片段,我们只有read()读取输入。那么如何区分输入?有人可以写下相当于Scanner的代码BufferedInputStream吗?我应该使用StringTokenizer类来标记我从read()获得的数据吗?这不会使整个东西(从STDIN读取输入)比Scanner慢?

+1

我相信BufferedReader包装了BufferedInputStream并提供了这些有用的方法。但是,如果您从键盘上读取数据,速度就不值得关注,因为即使是最快速的人类输入,其速度也会比最粗略的读取器慢几个数量级。在这种情况下,我(个人)认为使用Scanner的简单性超过了使用缓冲读取器带来的任何想象的性能收益。 – jpm 2012-03-27 16:55:49

+0

@jpm:请不要混淆键盘。这可以是任何'STDIN'来源。 – 2012-03-27 17:10:16

回答

1

BufferedInputStream不分析任何数据,它只是读取数据。您可以将缓冲读取器传递到扫描器类并从那里解析它。

+0

你能否详细解释我?如果你能写下与'Scanner'代码等价的'BufferedInputStream'代码,我会很感激你。 – 2012-03-27 16:59:44

0

查看Java教程中的chapter on streams。它描述了不同类型的流,其目的和用法。

但是,我不太明白为什么读取操作在读取用户输入时必须快速。用户输入的速度会比用于从键盘读取输入的方法慢得多(数量级慢)。

+0

请用任何'STDIN'源代替键盘。 'STDIN'可以是任何东西。 [本页](http://www.codechef.com/wiki/java)提倡使用'BufferedInputStream'来代替'Scanner'。 – 2012-03-27 17:15:15

+0

您可以编辑问题并删除单词“键盘”以使其更清晰。 – 2012-03-27 17:26:28