我必须在我的程序中阅读 txt 文件。我目前正在使用 FileReader 和 BufferedReader。我尝试使用 Scanner,但它比 FileReader 和 BufferedReader 慢。有没有什么类可以更快地读取文件?它必须用 Java 语言编写。
我需要从文本文件中读取所有单词(由空格分隔的字符串)
假设您读取内存中的所有文件,从代码编写的角度来看,最快的是:
List<String> lines = Files.readAllLines(yourFile, charset);
从执行的角度来看,我希望性能即使不是更好也一样好(据说这已经由编写它的团队进行了优化)。
然后,您可以拆分或做任何您需要的事情。
如果正在读取的文件很大,那么您可能希望BufferedReader
在 a 之上使用FileReader
来提高读取性能。
或者你可以尝试这样的事情: -
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;
}
读取和拆分的速度是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
。你需要多快?
如果您的文件很大 Files.readAllLines 将不起作用。但是,如果您仍然想尝试 NIO,这很容易:
FileInputStream fis = new FileInputStream("test.txt");
Reader rdr = Channels.newReader(fis.getChannel(), "UTF-8");
BufferedReader br = new BufferedReader(rdr);
...