2012-11-20 55 views
5

我必须在我的程序中读取txt文件。我目前正在使用FileReader和BufferedReader。我试图使用扫描仪,但比FileReader和BufferedReader慢。有什么课程可以更快地读取文件吗?它必须用Java语言编写。Java,从txt文件中读取速度最快的课程

我需要阅读从文本文件

+2

你有没有具体的证据表明从文件中读取是程序中的瓶颈?之后你对数据做了什么,文件有多大?请注意,我会避免'FileReader'自己 - 使用'InputStreamReader'封装'FileInputStream',所以你可以明确地设置编码。 –

+0

也许你的瓶颈是分裂线而不是阅读文件?有许多方法可以加速String.split()。根据我的经验,BufferedReader速度非常快。 – Serg

+0

理论上,Java NIO可以以比IO更快的速度读取文件 –

回答

1

如果正在读取的文件很大,那么您应该在FileReader的顶部使用BufferedReader以提高读取性能。

或者,你可以尝试的东西likethis: -

BufferedReader br = new BufferedReader(new FileReader("file.txt")); 
try { 
    StringBuilder sb = new StringBuilder(); 
    String line = br.readLine(); 

    while (line != null) { 
     sb.append(line); 
     sb.append("\n"); 
     line = br.readLine(); 
    } 
    String everything = sb.toString(); 
    } finally { 
    br.close(); 
} 

,或者你可以试试这个程序。对于较大的文件,它工作得更快: -

public String readDoc(File f) { 
String text = ""; 
int read, N = 1024 * 1024; 
char[] buffer = new char[N]; 

try { 
    FileReader fr = new FileReader(f); 
    BufferedReader br = new BufferedReader(fr); 

    while(true) { 
     read = br.read(buffer, 0, N); 
     text += new String(buffer, 0, read); 

     if(read < N) { 
      break; 
     } 
    } 
} catch(Exception ex) { 
    ex.printStackTrace(); 
} 

return text; 
} 
+0

我要读取的文件可能很大(大于100 MB)。 现在即时通讯这样那样的 http://pastebin.com/WUaJUT1G 我可以做得更快? 我正在为大学项目做这件事,我需要以最快的速度制作所有片段(阅读,创建树和在树中搜索)。 – user1736332

+0

这种方法是一种更好的方法。我已经检查过了。 –

+0

@ user1736332: - 我刚刚更新了我的答案,其中包含适用于较大文件的快速代码。请检查它。 –

2

(用空格splited字符串)的所有单词假设你读内存,最快的所有文件,从代码编写的角度来看,就是:

List<String> lines = Files.readAllLines(yourFile, charset); 

从执行的角度来看,我认为性能如果不是更好(这应该是由编写它的团队优化的)。

然后,您可以拆分或做任何你需要的。

1

读取和拆分的速度为85 MB/sec。 我使用了560 MB文件,每行有20列。 下面是代码:

package csvreader_speedtest; 

import java.io.*; 

public class Csvreader_SpeedTest { 

    final char delimiter = ','; 
    String[] splitted = new String[64]; 

    Csvreader_SpeedTest(String filename) throws Throwable { 
     File file = new File(filename); 
     BufferedReader reader = new BufferedReader(new FileReader(file)); 
     String line; 
     long t0 = System.currentTimeMillis(); 
     while ((line = reader.readLine()) != null) { 
      split(line); 
     } 
     long t1 = System.currentTimeMillis(); 
     reader.close(); 
     System.out.println("read " + file.length() + " bytes in " + (t1 - t0) + " ms"); 
    } 

    private void split(String line) { 
     int idxComma, idxToken = 0, fromIndex = 0; 
     while ((idxComma = line.indexOf(delimiter, fromIndex)) != -1) { 
      splitted[idxToken++] = line.substring(fromIndex, idxComma); 
      fromIndex = idxComma + 1; 
     } 
     splitted[idxToken] = line.substring(fromIndex); 
    } 
} 

输出:

read 561362951 bytes in 6575 ms 

更新: 如果我使用的splitted = line.split(",");代替split(line);,速度下降到32 MB/sec 更新2:而不破,则速度为194 MB/sec。你需要多快?

+0

我需要替换/ /等所有符号。 ,! ? - ()[] {}:; ''到''(空格),然后将所有空格分隔开来,如何做到这一点呢? – user1736332

+0

这是完全不同的问题,为了得到最可靠的答案,我建议把它贴出来,ei:“什么是用空格替换字符串中所有外观的最快方法?“ – Serg

1

如果你的文件很大Files.readAllLines将不起作用。但是如果你仍然想尝试NIO,很简单:

FileInputStream fis = new FileInputStream("test.txt"); 
Reader rdr = Channels.newReader(fis.getChannel(), "UTF-8"); 
BufferedReader br = new BufferedReader(rdr); 
...