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 性能 - 较大的缓冲区会减少本地调用,但会占用更多内存。
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 提供了几种写入数据的方法。 您可以写入单个字符、字符数组或字符串。 所有写入操作都经过缓冲以提高效率。 当缓冲区已满时,数据将写入底层流。
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'。 使用的实际分隔符取决于操作系统。
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 会自动刷新缓冲区。
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 显着提高了小写入的性能。 此示例比较了有缓冲和无缓冲的写入。 数据量越大,差异就越明显。
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 应用程序中处理高效的 I/O 操作至关重要。
作者
列出所有Java教程。