Java 快速逐行写入文件

在程序开发过程中,我们经常需要将数据写入文件。有时候,我们需要逐行写入文件,这在处理大数据量或实时数据时非常有用。在 Java 中,我们可以使用多种方式实现逐行写入文件的功能。本文将介绍几种常用的方法,并提供相应的代码示例。

方法一:使用 BufferedWriter

BufferedWriter 是 Java 中用于高效写入字符流的类。它提供了一些方法,可以方便地逐行写入文件。

首先,我们需要创建一个 BufferedWriter 对象,并将其关联到要写入的文件。下面是示例代码:

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class BufferedWriterExample {
    public static void main(String[] args) {
        try {
            BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"));
            writer.write("第一行数据");
            writer.newLine(); // 写入换行符
            writer.write("第二行数据");
            writer.newLine();
            writer.write("第三行数据");
            writer.close(); // 关闭 writer
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

上面的代码创建了一个名为 output.txt 的文件,并将三行数据写入其中。newLine() 方法用于写入换行符。

方法二:使用 PrintWriter

PrintWriter 是另一个常用于写入字符流的类。它也提供了逐行写入文件的功能。

下面是使用 PrintWriter 写入文件的示例代码:

import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class PrintWriterExample {
    public static void main(String[] args) {
        try {
            PrintWriter writer = new PrintWriter(new FileWriter("output.txt"));
            writer.println("第一行数据");
            writer.println("第二行数据");
            writer.println("第三行数据");
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

上面的代码与前面的示例类似,但使用了 println() 方法来逐行写入数据。println() 方法会自动在每行的末尾添加换行符。

方法三:使用 Files 类

Java 7 引入了新的文件操作 API,其中包含了一些方便的方法,可以更快速地处理文件。

下面是使用 Files 类写入文件的示例代码:

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;

public class FilesExample {
    public static void main(String[] args) {
        try {
            String[] data = {"第一行数据", "第二行数据", "第三行数据"};
            Files.write(Paths.get("output.txt"), String.join(System.lineSeparator(), data).getBytes(),
                    StandardOpenOption.CREATE);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

上面的代码使用了 Files.write() 方法,它接受文件路径、要写入的字节数组和一些选项作为参数。这里我们使用了 String.join() 方法将数据连接成一个字符串,并使用 System.lineSeparator() 方法获取系统的换行符。

性能比较

上述方法中,BufferedWriterPrintWriter 都提供了逐行写入文件的功能,而 Files.write() 方法则更加简洁。那么它们在性能方面有何区别呢?

我们可以通过测试来比较它们的性能。下面是使用 JMH(Java Microbenchmark Harness)框架编写的性能测试代码:

import org.openjdk.jmh.annotations.*;

import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.concurrent.TimeUnit;

@State(Scope.Thread)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
public class FileWritingBenchmark {

    private String[] data;

    @Setup
    public void setup() {
        data = new String[1000];
        for (int i = 0; i < 1000; i++) {
            data[i] = "Line " + i;
        }
    }

    @Benchmark
    public void bufferedWriterBenchmark() {
        try {
            BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"));
            for (String line : data) {
                writer.write(line);
                writer.newLine();
            }
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Benchmark
    public void printWriterBenchmark() {
        try {
            PrintWriter writer = new PrintWriter(new