2011-03-02 121 views
1

注:我目前使用java编码。我正在寻找将输入数据读入一个字符串,每次只读一行(或更多),并且我期望有很多总行数。从扫描仪或BufferedReader读取STDIN多行数据的方法更快吗?

现在我已经因为该行我输入是空间分隔的内实施

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

不幸的是,有了数百万行这个过程非常慢,他的扫描程序比我的数据处理占用更多的时间,所以我查看了java.io库,发现了一堆可能性,我不确定哪个一个使用(ByteArrayInputStream,FileInputStream,BufferedInputStreamPipedInputStream)。我应该使用哪一个?

要指定,我的数据从文本文件输入,每行有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线成数据一次,然后处理一切。太多选择寻找最佳解决方案。

回答

5

你应该换你System.inBufferInputStream,如:

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

,因为这样可以减少读取到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 
} 

从InputStreamReader的文档页面:

没有缓冲,每次调用 read()或readLine()都会导致从文件中读取字节 ,转换后的 转换成字符,然后返回, 这可能是非常低效的。

+0

嗨丹,这工作真的很好。我现在没有使用扫描仪,但仍然浪费了大量时间,因为阅读一条线似乎需要时间。有没有一种方法可以读取线条(系统。在,1000)或类似的东西,只是抓住一堆线,因为我期望(大部分时间)如果我有一条线,我应该有几十万? – user636224 2011-03-02 19:46:16

+0

您可以为'BufferedReader'构造函数提供额外的参数来提供缓存大小。这样,如果你想缓冲大量的数据,你可以提供一个非常大的缓冲区,比如32 MB。 – Dan 2011-03-02 20:04:04