Java BufferedWriter非常慢 - 300 MB的数据

Har*_*ger 0 java

我正在逐行读取由固定长度记录组成的文本文件,并附加一些值,然后写入另一个文件.

像往常一样,我使用BufferedWriter,发现它需要大约20分钟来读取,附加值并写入另一个文件.

BufferedWriter br = new BufferedReader(new FileReader(infile));
if (br != null) {
    for (String line; (line= br.readLine()) != null;) {
        i= i+ 1;
        line += "    " + String.format("%09d", i) + "S";
        try {
            bw = new BufferedWriter(new FileWriter("out.txt",
                    true));
            bw.write(line);
            bw.newLine();
            bw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是我用过的代码.读取整个文件并附加值仅需7秒,但写入文件似乎很慢.我知道BufferedWriter的速度要慢得多.我没有增加缓冲区大小,因为我正在逐行阅读,出于同样的原因没有尝试nio.

建议我提高速度的方法?

Jon*_*eet 7

这里至少有两个问题:

  • 您将在每次迭代时重新打开输出文件.这几乎一定很慢.打开阅读器的同时打开一次.
  • 你没有关闭例外的读者或作者.使用try-with-resources块(Java 7)或try/finally块(Java 7之前版本)

后者不会是性能问题,但它可能会破坏其他需要关闭文件的代码.

此外,我强烈建议不要使用FileReaderFileWriter,因为两者都使用平台默认编码,而不允许您指定任何其他内容.如果您使用的是Java 7,使用Files.newBufferedReader以及Files.newBufferedWriter其中:

  • 代码方面较短
  • 默认情况下使用UTF-8(这通常是最佳选择)
  • 如果您需要其他内容,可以指定编码