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教程。