Rumah > Java > javaTutorial > Adakah `BufferedWriter` Cara Terpantas untuk Menulis Data Besar ke Fail Teks di Java?

Adakah `BufferedWriter` Cara Terpantas untuk Menulis Data Besar ke Fail Teks di Java?

Susan Sarandon
Lepaskan: 2024-11-09 19:12:02
asal
802 orang telah melayarinya

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

Kaedah Terpantas untuk Menulis Data Luas ke Fail Teks dalam Java

Pengenalan:

Menulis volum besar data ke fail teks boleh menjadi tugas penting dalam pelbagai senario pengaturcaraan. Di Java, kelas BufferedWriter biasanya digunakan untuk tujuan ini. Walau bagaimanapun, adalah penting untuk mempertimbangkan kecekapan operasi, terutamanya apabila berurusan dengan set data besar-besaran.

Soalan:

Bolehkah BufferedWriter menawarkan kelajuan optimum untuk menulis data besar ke fail teks? Bolehkah Java menyediakan alternatif yang lebih cekap?

Respons:

Walaupun BufferedWriter ialah kaedah yang digunakan secara meluas untuk menulis fail, ia mungkin tidak selalu menjadi penyelesaian terpantas untuk data yang sangat besar . Untuk mengoptimumkan prestasi, memintas BufferedWriter dan terus menggunakan FileWriter mungkin bermanfaat. Sistem moden sering menyimpan data dalam memori cache, menjadikan mekanisme penimbalan BufferedWriter berlebihan.

Keputusan:

Ujian empirikal menunjukkan bahawa penggunaan FileWriter secara langsung boleh meningkatkan kelajuan tulis dengan ketara. Ujian penanda aras yang melibatkan penulisan 175MB data (4 juta rentetan) menggunakan FileWriter mencapai julat masa 4-5 saat, jauh lebih pantas daripada menggunakan BufferedWriter.

Pertimbangan Tambahan:

Mengasingkan komponen masa untuk mendapatkan semula rekod dan menulis fail boleh memberikan nilai yang berharga cerapan tentang kecekapan proses keseluruhan.

Kod Contoh:

Coretan kod berikut menggambarkan ujian prestasi yang membandingkan penulisan data mentah dengan penulisan menggunakan BufferedWriters dengan penimbal yang berbeza saiz:

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");
    }
}
Salin selepas log masuk

Atas ialah kandungan terperinci Adakah `BufferedWriter` Cara Terpantas untuk Menulis Data Besar ke Fail Teks di Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan