Java 比扫描仪或BufferedReader从STDIN读取多行数据更快的方法?

Java 比扫描仪或BufferedReader从STDIN读取多行数据更快的方法?,java,performance,inputstream,textinput,Java,Performance,Inputstream,Textinput,注意:我目前正在用java编写代码。我希望将输入数据读入一个字符串,一次一行或多行,并且我希望有很多行 现在我已经实现了 scanner in = new Scanner(System.in) while (in.hasNextLine()) { separated = in.nextLine().split(" "); ... } 因为在这行中,我的输入是以空格分隔的 不幸的是,由于有数百万行,这个过程非常慢,而且扫描器占用的时间比我的数据处理时间要多,所以我查看了java.

注意:我目前正在用java编写代码。我希望将输入数据读入一个字符串,一次一行或多行,并且我希望有很多行

现在我已经实现了

scanner in = new Scanner(System.in)
while (in.hasNextLine()) {
    separated = in.nextLine().split(" ");
    ...
}
因为在这行中,我的输入是以空格分隔的

不幸的是,由于有数百万行,这个过程非常慢,而且扫描器占用的时间比我的数据处理时间要多,所以我查看了java.io库,发现了许多可能性,我不确定使用哪一种方法:ByteArrayInputStream、FileInputStream、BufferedInputStream、PipedInputStream。我应该用哪一个

具体来说,我的数据是从一个文本文件导入的,每行有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行数据,然后处理所有内容。寻找最佳解决方案的选项太多。

您应该使用BufferInputStream将您的System.in包装为:

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

另外,如果你只是在读一行,你并不需要扫描仪,而是需要一个读卡器,它有readLine和ready方法来获取新行,并查看是否还有更多的数据需要读取

您可以这样使用它,请参见以下示例:

我向BufferedReader添加了一个32MB的缓存大小参数

从InputStreamReader文档页面:

在没有缓冲的情况下,每次调用 read或readLine可能导致字节数增加 要从文件中读取,请进行转换 输入字符,然后返回, 这可能是非常低效的

您应该使用BufferInputStream包装System.in,如:

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

另外,如果你只是在读一行,你并不需要扫描仪,而是需要一个读卡器,它有readLine和ready方法来获取新行,并查看是否还有更多的数据需要读取

您可以这样使用它,请参见以下示例:

我向BufferedReader添加了一个32MB的缓存大小参数

从InputStreamReader文档页面:

在没有缓冲的情况下,每次调用 read或readLine可能导致字节数增加 要从文件中读取,请进行转换 输入字符,然后返回, 这可能是非常低效的


嗨,丹,这个很好用。我现在在没有扫描仪的情况下使用它,但仍然浪费了很多时间,因为读一行似乎需要时间。有没有一种方法可以让我读取LinesSystem.in、1000或类似的内容,然后抓取一堆行,因为我希望大多数时候,如果我只剩下一行,我应该有几十万行?您可以向BufferedReader构造函数提供一个附加参数,以提供缓存大小。这样的话,如果你想一次缓冲大量数据,你可以提供一个非常大的缓冲区,比如32MB。嗨,丹,这个效果非常好。我现在在没有扫描仪的情况下使用它,但仍然浪费了很多时间,因为读一行似乎需要时间。有没有一种方法可以让我读取LinesSystem.in、1000或类似的内容,然后抓取一堆行,因为我希望大多数时候,如果我只剩下一行,我应该有几十万行?您可以向BufferedReader构造函数提供一个附加参数,以提供缓存大小。这样,如果您想一次缓冲大量数据,可以提供一个非常大的缓冲区,比如32MB。
BufferedInputStream bis = new BufferedInputStream(System.in);
Scanner in = new Scanner(bis);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in), 32*1024*1024);
while (br.ready()) {
    String line = br.readLine();
    // process line
}