Heim > Java > javaLernprogramm > Hauptteil

Ist „BufferedWriter' der schnellste Weg, große Datenmengen in eine Textdatei in Java zu schreiben?

Susan Sarandon
Freigeben: 2024-11-09 19:12:02
Original
771 Leute haben es durchsucht

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

Schnellste Methode zum Schreiben umfangreicher Daten in Textdateien in Java

Einführung:

Schreiben Die Umwandlung großer Datenmengen in Textdateien kann in verschiedenen Programmierszenarien eine entscheidende Aufgabe sein. In Java wird zu diesem Zweck häufig die Klasse BufferedWriter verwendet. Es ist jedoch wichtig, die Effizienz des Vorgangs zu berücksichtigen, insbesondere beim Umgang mit großen Datenmengen.

Frage:

Kann BufferedWriter die optimale Geschwindigkeit zum Schreiben großer Datenmengen bieten? eine Textdatei? Kann Java effizientere Alternativen bieten?

Antwort:

BufferedWriter ist zwar eine weit verbreitete Methode zum Schreiben von Dateien, für sehr große Datenmengen ist es jedoch möglicherweise nicht immer die schnellste Lösung . Um die Leistung zu optimieren, kann es von Vorteil sein, BufferedWriter zu umgehen und den FileWriter direkt zu verwenden. Moderne Systeme speichern Daten oft im Cache-Speicher, wodurch der Puffermechanismus des BufferedWriter überflüssig wird.

Ergebnisse:

Empirische Tests zeigen, dass die direkte Verwendung von FileWriter die Schreibgeschwindigkeit erheblich verbessern kann. Ein Benchmark-Test, bei dem 175 MB Daten (4 Millionen Zeichenfolgen) mit FileWriter geschrieben wurden, erreichte einen Zeitbereich von 4 bis 5 Sekunden und war damit deutlich schneller als mit BufferedWriter.

Zusätzliche Überlegungen:

Die Isolierung der Zeitkomponenten für das Abrufen von Datensätzen und das Schreiben von Dateien kann wertvolle Erkenntnisse über die Gesamteffizienz liefern verarbeiten.

Beispielcode:

Der folgende Codeausschnitt veranschaulicht einen Leistungstest, der das Schreiben von Rohdaten mit dem Schreiben mithilfe von BufferedWriters mit unterschiedlichen Puffergrößen vergleicht:

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");
    }
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonIst „BufferedWriter' der schnellste Weg, große Datenmengen in eine Textdatei in Java zu schreiben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage