首頁 >Java >java教程 >「BufferedWriter」是將大數據寫入 Java 文字檔案的最快方法嗎?

「BufferedWriter」是將大數據寫入 Java 文字檔案的最快方法嗎?

Susan Sarandon
Susan Sarandon原創
2024-11-09 19:12:02804瀏覽

Is `BufferedWriter` the Fastest Way to Write Large Data to a Text File in Java?

用Java 將大量數據寫入文本文件的最快方法

簡介:

寫入在各種程式設計場景中,將大量資料轉換為文字檔案可能是一項至關重要的任務。在 Java 中,BufferedWriter 類別通常用於此目的。然而,考慮操作的效率很重要,尤其是在處理大量資料集時。

問題:

BufferedWriter 能否提供將大數據寫入到的最佳速度文字檔案? Java 可以提供更有效率的替代方案嗎?

回覆:

雖然BufferedWriter 是一種廣泛使用的檔案寫入方法,但對於非常大的資料來說,它可能並不總是最快的解決方案。為了優化效能,繞過 BufferedWriter 並直接使用 FileWriter 可能會有所幫助。現代系統通常將資料儲存在快取中,使得 BufferedWriter 的緩衝機制變得多餘。

結果:

經驗測試顯示直接使用 FileWriter 可以顯著提高寫入速度。使用 FileWriter 寫入 175MB 資料(400 萬字串)的基準測試實現了 4-5 秒的時間範圍,明顯快於使用 BufferedWriter。

其他注意事項:

隔離記錄檢索和文件寫入的時間部分可以為整體效率提供有價值的見解

範例程式碼:

以下程式碼片段示範了一個效能測試,該測試將寫入原始資料與使用不同緩衝區大小的BufferedWriter 進行寫入進行比較:

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;

public class FileWritingPerfTest {

    private static final int ITERATIONS = 5;
    private static final double MEG = (Math.pow(1024, 2));
    private static final int RECORD_COUNT = 4000000;
    private static final String RECORD = "Help I am trapped in a fortune cookie factory\n";
    private static final int RECSIZE = RECORD.getBytes().length;

    public static void main(String[] args) throws Exception {
        List<String> records = new ArrayList<>(RECORD_COUNT);
        int size = 0;
        for (int i = 0; i < RECORD_COUNT; i++) {
            records.add(RECORD);
            size += RECSIZE;
        }
        System.out.println(records.size() + " 'records'");
        System.out.println(size / MEG + " MB");

        for (int i = 0; i < ITERATIONS; i++) {
            System.out.println("\nIteration " + i);

            writeRaw(records);
            writeBuffered(records, 8192);
            writeBuffered(records, (int) MEG);
            writeBuffered(records, 4 * (int) MEG);
        }
    }

    private static void writeRaw(List<String> records) throws IOException {
        File file = File.createTempFile("foo", ".txt");
        try {
            FileWriter writer = new FileWriter(file);
            System.out.print("Writing raw... ");
            write(records, writer);
        } finally {
            // comment this out if you want to inspect the files afterward
            file.delete();
        }
    }

    private static void writeBuffered(List<String> records, int bufSize) throws IOException {
        File file = File.createTempFile("foo", ".txt");
        try {
            FileWriter writer = new FileWriter(file);
            BufferedWriter bufferedWriter = new BufferedWriter(writer, bufSize);

            System.out.print("Writing buffered (buffer size: " + bufSize + ")... ");
            write(records, bufferedWriter);
        } finally {
            // comment this out if you want to inspect the files afterward
            file.delete();
        }
    }

    private static void write(List<String> records, Writer writer) throws IOException {
        long start = System.currentTimeMillis();
        for (String record : records) {
            writer.write(record);
        }
        // writer.flush(); // close() should take care of this
        writer.close();
        long end = System.currentTimeMillis();
        System.out.println((end - start) / 1000f + " seconds");
    }
}

以上是「BufferedWriter」是將大數據寫入 Java 文字檔案的最快方法嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn