首页 > Java > java教程 > 'BufferedWriter”是将大数据写入 Java 文本文件的最快方法吗?

'BufferedWriter”是将大数据写入 Java 文本文件的最快方法吗?

Susan Sarandon
发布: 2024-11-09 19:12:02
原创
801 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板