簡體   English   中英

Java BufferedWriter非常慢-300 MB數據

[英]Java BufferedWriter very slow - 300 MB of data

我正在逐行讀取包含固定長度記錄的文本文件,並附加一些值,然后寫入另一個文件。

和往常一樣,我使用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();
        }
    }

這是我使用的代碼。 讀取整個文件並附加值僅需7秒鍾,但寫入文件似乎很慢。 我知道BufferedWriter不能這么慢。 我沒有逐行讀取緩沖區大小,並且出於同樣的原因也沒有嘗試nio。

建議我一些提高速度的方法?

這里至少有兩個問題:

  • 您將在每次迭代中重新打開輸出文件。 這注定會很慢。 打開閱讀器的同時將其打開一次。
  • 您不會關閉異常的讀取器或寫入器。 使用try-with-resources塊(Java 7)或try/finally塊(Java 7之前的版本)

后者不會造成性能問題,但可能會破壞其他預期文件已關閉的代碼。

此外,我強烈建議您不要使用FileReaderFileWriter ,因為兩者都使用平台默認編碼,而無需您指定其他任何內容。 如果您使用的是Java 7,請使用Files.newBufferedReaderFiles.newBufferedWriter

  • 在代碼方面更短
  • 默認情況下使用UTF-8(通常是最佳選擇)
  • 如果需要其他功能,可以指定編碼

您正在創建一個新的bufferedwriter,然后通過它為您處理的每一行輸入打開和關閉文件編寫器。

而是在for循環之前創建bw,然后在之后將其關閉。

有兩個原因會使您的代碼運行緩慢:

  1. 每次寫一行時,您就創建文件outputstream
  2. 您使用BufferedReader和BufferedWriter逐行讀取和寫入

試試這個代碼:

public void copyFile() throws IOException{
    FileInputStream fis = new FileInputStream(new File("in.txt"));
    FileOutputStream fos = new FileOutputStream(new File("out.txt"));
    byte[] buffer = new byte[1024];
    int len;
    while((len = fis.read(buffer)) != -1){
        fos.write(buffer, 0, len);
    }
    fos.close();
    fis.close();
}

使用FileInputStreamFileOutputStreambuffer可以通過增加或減小buffer大小來控制讀寫速度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM