use*_*224 1 java performance inputstream textinput
注意:我目前正在用java编写代码.我希望将输入数据读入一个字符串,一次一行(或更多),我期待很多总行.
现在我已经实施了
scanner in = new Scanner(System.in)
while (in.hasNextLine()) {
separated = in.nextLine().split(" ");
...
}
Run Code Online (Sandbox Code Playgroud)
因为在行内我的输入是空格分隔的.
不幸的是,有了数百万行,这个过程非常慢,而且他的扫描程序比我的数据处理花费的时间更多,所以我查看了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
...
Run Code Online (Sandbox Code Playgroud)
有没有一种方法,扫描仪可以一次读取1000行左右并提高效率,或者我应该使用哪种数据类型(最小化速度)?
旁注:试验时我试过:
java.io.BufferedReader stdin = new java.io.BufferedReader(new java.io.InputStreamReader(System.in));
while(in.ready()){
separated = in.readLine().split(" ");
...
}
Run Code Online (Sandbox Code Playgroud)
哪个效果很好,只是想知道哪一个效果最好,如果有任何方法,比如说,一次读取100行数据然后处理所有内容.寻求最佳解决方案的选择太多.
你应该换你System.in有BufferInputStream这样的:
BufferedInputStream bis = new BufferedInputStream(System.in);
Scanner in = new Scanner(bis);
Run Code Online (Sandbox Code Playgroud)
因为这可以最大限度地减少对System.in的读取量,从而提高效率(BufferedInputStream).
另外,如果你只是念台词,你并不真的需要一个扫描仪,而是一个阅读器(它具有 readLine()和ready()方法来获取新行,并看看是否有任何更多的数据被读取).
你可以这样使用它(参见java6:InputStreamReader中的例子):
(我添加了一个32MB的缓存大小参数BufferedReader)
BufferedReader br = new BufferedReader(new InputStreamReader(System.in), 32*1024*1024);
while (br.ready()) {
String line = br.readLine();
// process line
}
Run Code Online (Sandbox Code Playgroud)
从InputStreamReader文档页面:
如果没有缓冲,read()或readLine()的每次调用都可能导致从文件中读取字节,转换为字符,然后返回,这可能是非常低效的.
| 归档时间: |
|
| 查看次数: |
6818 次 |
| 最近记录: |