Java IO 教程

Java IO:BufferedWriter 类

在 Java 的 I/O 中,java.io.BufferedWriter 类为 Writer 实例赋予了缓冲能力。缓冲机制在提升 I/O 操作速度方面效果显著。与逐个字符地将数据写入网络或磁盘不同,BufferedWriter 会一次写入一大块数据。这种批量写入的方式能大幅提高效率,尤其是在处理磁盘读写操作以及面对大量数据时,优势更加突出。

由于 BufferedWriter 是 Writer 的子类,所以在任何需要使用 Writer 的地方,都能使用 BufferedWriter,借助其缓冲功能优化写入性能。

BufferedWriter 示例

要为一个 Writer 添加缓冲功能,只需将其包装在一个 BufferedWriter 中。如下所示:

package com.hxstrive.java_io;

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

public class BufferedWriterExample {
    public static void main(String[] args) throws Exception {
        try(BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("output.txt"))) {
            bufferedWriter.write("hello world");
            bufferedWriter.write('!');
        }
    }
}

上面示例,创建了一个 BufferedWriter,它将字符串“hello world”和字符“!”写入 FileWriter。

BufferedWriter 缓冲大小

你可以通过 BufferedWriter 的构造函数参数去设置 BufferedWriter 内部使用的缓冲区大小。如下:

int bufferSize = 8 * 1024;
BufferedWriter bufferedWriter = 
    new BufferedWriter(new FileWriter("output.txt"), bufferSize);

上述示例,将 BufferedWriter 的内部缓冲区设置为 8 KB。注意,最好使用 1024 字节倍数的缓冲区大小。这与硬盘等大多数内置缓冲区的效果最佳。

除了为输入流添加缓冲外,BufferedWriter 的行为与 Writer 几乎一样。不过,BufferedWriter 增加了一个额外的方法: newLine() 方法,它可以向底层 Writer 写入换行符。此外,如果需要绝对确保之前写入的字符已从缓冲区刷新到网络或磁盘上,则可能需要调用 flush() 方法,强制将数据刷新到底层。

write(int)

BufferedWriter 的 write(int) 方法将整数的低 16 位作为单个字符写入其内部缓冲区。例如:

bufferedWriter.write('A');

write(char[])

BufferedWriter 也有一个 write(char[]) 方法,该方法可以将一个字符数组写入其内部缓冲区。write(char[]) 方法会返回实际写入 Writer 的字符数量。例如:

char[] chars = new char[]{'A','B','C','D','E'};
bufferedWriter.write(chars);

注意,向 BufferedWriter 写入字符数组比一次写入一个字符要快。由于 BufferedWriter 在将写入的字符写入底层 Writer 之前,会将其收集到内部缓冲区中,因此速度提升不如其他 Writer 类(不使用缓冲)明显。不过,速度仍有小幅提升。

flush()

BufferedWriter 的 flush() 方法会将写入 BufferedWriter 的所有数据刷新到底层数据目标。通过调用 flush(),您可以确保任何缓冲数据都将被刷新(写入)到磁盘(或网络,或 BufferedWriter 的其他目标)。例如:

bufferedWriter.flush();

关闭 BufferedWriter

当你完成向 BufferedWriter 写入字符后,一定要记得关闭它。关闭 BufferedWriter 也会关闭 BufferedWriter 所写入的 Writer 实例。

关闭 BufferedWriter 仅需要调用其 close() 方法。如下:

bufferedWriter.close();

你也可以使用 Java7 中引入的 try-with-resources 结构,自动关闭 BufferedWriter。如下:

FileWriter output = new FileWriter("output.txt");
try(BufferedWriter bufferedWriter = new BufferedWriter(output)){
    bufferedWriter.write("Hello World");
}

注意,第一个 FileWriter 实例并没有在 try-with-resources 代码块中创建。这意味着 try-with-resources 块不会自动关闭 FileWriter 实例。不过,当 BufferedWriter 关闭时,它也会关闭它所写入的 OutputStream 实例,因此 FileWriter 实例会在 BufferedWriter 关闭时被关闭。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号