我必须在我的程序中读取txt文件。我目前正在使用FileReader和BufferedReader。我尝试使用Scanner,但速度比FileReader和BufferedReader慢。有没有可以更快读取文件的类?它必须用Java语言编写。
我需要从文本文件
中读取所有单词(由空格分割的字符串)答案 0 :(得分:2)
假设你读取了内存中的所有文件,从代码编写的角度来看,最快的是:
List<String> lines = Files.readAllLines(yourFile, charset);
从执行的角度来看,我希望性能能够做得好(如果不是更好的话)(这应该是由编写它的团队优化的)。
然后你可以拆分或做你需要的任何事情。
答案 1 :(得分:1)
如果正在阅读的文件非常庞大,那么您可以在BufferedReader
之上使用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;
}
答案 2 :(得分: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
。你需要多快的速度?
答案 3 :(得分:1)
如果您的文件很大,则Files.readAllLines不会工作。但如果你还想尝试NIO,那很简单:
FileInputStream fis = new FileInputStream("test.txt");
Reader rdr = Channels.newReader(fis.getChannel(), "UTF-8");
BufferedReader br = new BufferedReader(rdr);
...