Maison >Java >javaDidacticiel >« BufferedWriter » est-il le moyen le plus rapide d'écrire des données volumineuses dans un fichier texte en Java ?

« BufferedWriter » est-il le moyen le plus rapide d'écrire des données volumineuses dans un fichier texte en Java ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-09 19:12:02810parcourir

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

Méthode la plus rapide pour écrire des données détaillées dans des fichiers texte en Java

Introduction :

Écriture de gros volumes de données dans des fichiers texte peuvent constituer une tâche cruciale dans divers scénarios de programmation. En Java, la classe BufferedWriter est couramment utilisée à cette fin. Cependant, il est important de prendre en compte l'efficacité de l'opération, en particulier lorsqu'il s'agit d'ensembles de données volumineux.

Question :

BufferedWriter peut-il offrir la vitesse optimale pour écrire des données volumineuses sur un fichier texte ? Java peut-il fournir des alternatives plus efficaces ?

Réponse :

Bien que BufferedWriter soit une méthode largement utilisée pour l'écriture de fichiers, elle n'est pas toujours la solution la plus rapide pour les données très volumineuses. . Pour optimiser les performances, contourner BufferedWriter et utiliser directement FileWriter peut être bénéfique. Les systèmes modernes stockent souvent les données dans la mémoire cache, ce qui rend le mécanisme de mise en mémoire tampon de BufferedWriter redondant.

Résultats :

Des tests empiriques démontrent que l'utilisation directe de FileWriter peut améliorer considérablement les vitesses d'écriture. Un test de référence impliquant l'écriture de 175 Mo de données (4 millions de chaînes) à l'aide de FileWriter a atteint une plage de temps de 4 à 5 secondes, nettement plus rapide que l'utilisation de BufferedWriter.

Considérations supplémentaires :

Isoler les composantes temporelles pour la récupération des enregistrements et l'écriture des fichiers peut fournir des informations précieuses sur l'efficacité de l'ensemble processus.

Exemple de code :

L'extrait de code suivant illustre un test de performances qui compare l'écriture de données brutes à l'écriture à l'aide de BufferedWriters avec différentes tailles de tampon :

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");
    }
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn