ZetCode

Java BufferedWriter 类

最后修改时间:2025 年 4 月 16 日

java.io.BufferedWriter 类为另一个输出流添加了缓冲功能。 它通过减少本地 I/O 调用次数来提高性能。 数据从缓冲区以大块形式写入底层流。

BufferedWriter 包装另一个 Writer 并提供缓冲写入功能。 默认缓冲区大小为 8192 个字符 (8KB),但可以指定自定义大小。 此类是线程安全的,可用于并发访问。

BufferedWriter 类概述

BufferedWriter 扩展了 Writer 并提供缓冲输出操作。 关键方法包括写入操作、newLine 功能和流刷新。 缓冲区在已满或显式刷新时写入底层流。

public class BufferedWriter extends Writer {
    public BufferedWriter(Writer out);
    public BufferedWriter(Writer out, int sz);
    public void write(int c) throws IOException;
    public void write(char[] cbuf, int off, int len) throws IOException;
    public void write(String s, int off, int len) throws IOException;
    public void newLine() throws IOException;
    public void flush() throws IOException;
    public void close() throws IOException;
}

上面的代码显示了 BufferedWriter 提供的关键方法。 这些方法允许使用缓冲进行高效的数据写入。 该类提供平台独立的 newLine 功能和自动刷新。

创建 BufferedWriter

BufferedWriter 是通过将其包装在另一个 Writer 周围来创建的。 您可以指定缓冲区大小或使用默认值。 缓冲区大小会影响 I/O 性能 - 较大的缓冲区会减少本地调用,但会占用更多内存。

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

public class Main {

    public static void main(String[] args) {
        try {
            // Create with default buffer size
            Writer fileWriter = new FileWriter("output.txt");
            BufferedWriter bufferedWriter1 = new BufferedWriter(fileWriter);
            
            // Create with custom buffer size (16KB)
            Writer fileWriter2 = new FileWriter("output2.txt");
            BufferedWriter bufferedWriter2 = 
                new BufferedWriter(fileWriter2, 16384);
            
            System.out.println("Default buffer writer created");
            System.out.println("Custom buffer (16KB) writer created");
            
            bufferedWriter1.close();
            bufferedWriter2.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

此示例演示了创建 BufferedWriter 的不同方法。 第一个使用默认缓冲区大小,而第二个指定 16KB。 完成后务必关闭 writer 以释放资源。 关闭 BufferedWriter 时,底层 FileWriter 会自动关闭。

使用 BufferedWriter 写入数据

BufferedWriter 提供了几种写入数据的方法。 您可以写入单个字符、字符数组或字符串。 所有写入操作都经过缓冲以提高效率。 当缓冲区已满时,数据将写入底层流。

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

public class Main {

    public static void main(String[] args) {
        try (BufferedWriter writer = 
                new BufferedWriter(new FileWriter("output.txt"))) {
            
            // Write single character
            writer.write('A');
            
            // Write character array
            char[] chars = {'B', 'C', 'D'};
            writer.write(chars);
            
            // Write string
            writer.write("Hello, World!");
            
            // Write portion of string
            writer.write("Java Programming", 0, 4); // Writes "Java"
            
            System.out.println("Data written successfully");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

此示例展示了使用 BufferedWriter 写入数据的各种方法。 try-with-resources 语句确保正确的 writer 关闭。 数据保留在缓冲区中,直到缓冲区已满或显式刷新。 write 方法有效地处理不同的数据类型。

使用 newLine 方法

newLine 方法写入平台独立的行分隔符。 建议不要直接写入 '\n'。 使用的实际分隔符取决于操作系统。

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

public class Main {

    public static void main(String[] args) {
        try (BufferedWriter writer = 
                new BufferedWriter(new FileWriter("lines.txt"))) {
            
            writer.write("First line");
            writer.newLine();
            writer.write("Second line");
            writer.newLine();
            writer.write("Third line");
            
            System.out.println("Lines written with platform-specific separators");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

此示例演示了使用 newLine 写入平台适当的行尾。 在 Windows 上,这将写入“\r\n”,而在 Unix 上,它将写入“\n”。 使用此方法可确保无论在哪个平台上都使用正确的行尾。

刷新缓冲区

flush 方法强制将任何缓冲的输出写入底层流。 当您需要确保立即写入数据时,这非常有用。 关闭 writer 会自动刷新缓冲区。

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

public class Main {

    public static void main(String[] args) {
        try (BufferedWriter writer = 
                new BufferedWriter(new FileWriter("log.txt"))) {
            
            writer.write("Starting application");
            writer.newLine();
            
            // Force write to disk
            writer.flush();
            
            // Simulate long operation
            Thread.sleep(5000);
            
            writer.write("Operation completed");
            writer.newLine();
            
            System.out.println("Log entries written with explicit flush");
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

此示例显示了缓冲区的显式刷新。 由于 flush 调用,第一个日志条目会立即写入。 如果不刷新,数据可能会保留在内存中,直到缓冲区填满或 writer 关闭。 刷新对于实时日志记录非常重要。

性能比较

通过减少本地 I/O 调用,BufferedWriter 显着提高了小写入的性能。 此示例比较了有缓冲和无缓冲的写入。 数据量越大,差异就越明显。

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

public class Main {

    public static void main(String[] args) {
        final int LINES = 10000;
        
        // Without buffering
        long start = System.currentTimeMillis();
        try (Writer writer = new FileWriter("unbuffered.txt")) {
            for (int i = 0; i < LINES; i++) {
                writer.write("Line " + i + "\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        long unbufferedTime = System.currentTimeMillis() - start;
        
        // With buffering
        start = System.currentTimeMillis();
        try (BufferedWriter writer = 
                new BufferedWriter(new FileWriter("buffered.txt"))) {
            for (int i = 0; i < LINES; i++) {
                writer.write("Line " + i);
                writer.newLine();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        long bufferedTime = System.currentTimeMillis() - start;
        
        System.out.println("Unbuffered time: " + unbufferedTime + "ms");
        System.out.println("Buffered time: " + bufferedTime + "ms");
    }
}

此示例演示了缓冲的性能优势。 缓冲版本通常会快得多,尤其是在许多小写入的情况下。 BufferedWriter 通过在写入之前将数据收集在内存中来减少实际 I/O 操作的次数。

来源

Java BufferedWriter 类文档

在本文中,我们介绍了 Java BufferedWriter 类的基本方法和功能。 了解这些概念对于在 Java 应用程序中处理高效的 I/O 操作至关重要。

作者

我叫 Jan Bodnar,是一位经验丰富的专业程序员。 我于 2007 年开始撰写编程文章,至今已撰写了 1,400 多篇文章和 8 本电子书。 凭借超过八年的教学经验,我致力于分享我的知识并帮助他人掌握编程概念。

列出所有Java教程