Java,从txt文件中读取最快的类

我必须在我的程序中读取txt文件。 我目前正在使用FileReader和BufferedReader。 我尝试使用Scanner,但速度比FileReader和BufferedReader慢。 有没有可以更快读取文件的类? 它必须用Java语言编写。

我需要从文本文件中读取所有单词(由空格分割的字符串)

如果要读取的文件很大,那么您可能希望在FileReader之上使用BufferedReader来提高读取性能。

或者你可以尝试一下这个:

  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; } 

假设您从内存中读取了所有文件,从代码编写的角度来看,最快的是:

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

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

然后你可以拆分或做任何你需要的事情。

如果您的文件很大,则Files.readAllLines不会工作。 但如果你还想尝试NIO,那很简单:

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

读取和分割的速度为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 。 你需要多快的速度?