比Scanner或BufferedReader从STDIN读取多行数据更快的方法?

时间:2011-03-02 19:21:03

标签: java performance inputstream textinput

注意:我目前正在用java编码。我希望将输入数据读入一个字符串,一次一行(或更多),我期望总行数。

现在我已经实施了

scanner in = new Scanner(System.in)
while (in.hasNextLine()) {
    separated = in.nextLine().split(" ");
    ...
}

因为在行内我的输入是空格分隔的。

不幸的是,有了数百万行,这个过程非常慢,而且他的扫描程序比我的数据处理花费的时间更多,所以我查看了java.io库并找到了一堆可能性,我不知道哪一个使用(ByteArrayInputStreamFileInputStreamBufferedInputStreamPipedInputStream)。我应该使用哪一个?

要指定,我的数据是从文本文件传入的,每行有4或6个单词以换行符结束,我需要一次分析一行,设置(4或6)个单词到我可以暂时管理的数组。 数据格式:

392903840 a c b 293 32.90
382049804 a c 390
329084203 d e r 489 384.90
...

有没有一种方法,扫描仪可以一次读取1000行左右并提高效率,或者我应该使用哪种数据类型(以最大限度地降低速度)?

旁注:试验时我尝试过:

java.io.BufferedReader stdin = new java.io.BufferedReader(new java.io.InputStreamReader(System.in));
while(in.ready()){
    separated = in.readLine().split(" ");
    ...
}

哪个效果很好,只是想知道哪一个效果最好,如果有任何方法,比如说,一次读取100行数据然后处理所有内容。寻求最佳解决方案的选择太多了。

1 个答案:

答案 0 :(得分:5)

你应该用System.in包裹你的BufferInputStream

BufferedInputStream bis = new BufferedInputStream(System.in);
Scanner in = new Scanner(bis);

因为这可以最大限度地减少对System.in的读取量,从而提高效率(BufferedInputStream)。

另外,如果你只是阅读线条,你真的不需要一个扫描仪,而是一个阅读器(它有readLine()ready()方法来获得一条新线,看看是否有任何线条更多数据要阅读。)

您可以这样使用它(请参阅java6 : InputStreamReader上的示例):

(我向BufferedReader添加了32MB的缓存大小参数)

BufferedReader br = new BufferedReader(new InputStreamReader(System.in), 32*1024*1024);
while (br.ready()) {
    String line = br.readLine();
    // process line
}

从InputStreamReader文档页面:

  

没有缓冲,每次调用   read()或readLine()可能导致字节   要从文件中读取,转换   变成人物,然后归来,   这可能是非常低效的。