6

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

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

4

4 回答 4

2

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

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

从执行的角度来看,我希望性能即使不是更好也一样好(据说这已经由编写它的团队进行了优化)。

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

于 2012-11-20T19:05:08.927 回答
1

如果正在读取的文件很大,那么您可能希望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;
}
于 2012-11-20T19:06:09.313 回答
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。你需要多快?

于 2012-11-20T19:46:21.910 回答
1

如果您的文件很大 Files.readAllLines 将不起作用。但是,如果您仍然想尝试 NIO,这很容易:

FileInputStream fis = new FileInputStream("test.txt");
Reader rdr = Channels.newReader(fis.getChannel(), "UTF-8");
BufferedReader br = new BufferedReader(rdr);
...
于 2012-11-20T19:47:01.767 回答