Java 字节流与字符流中 write 和 flush 有什么区别
write 负责将数据写入流的缓冲区,而 flush 负责将缓冲区中的数据强制刷新到目标设备。在 java i/o 中,为了提高效率,大多数流都采用了缓冲机制,数据先写入内存中的缓冲区,只有当缓冲区满、调用 close() 或显式调用 flush() 时,数据才会真正输出。对于字节流(如 fileoutputstream),默认通常不缓冲,write 直接写入底层;而对于字符流(如 filewriter)或包装了缓冲区的字节流(如 bufferedoutputstream),flush 是确保数据落盘的关键操作。

字节流与字符流的缓冲行为差异
字节流和字符流在默认缓冲行为上存在显著差异。FileOutputStream 等基础字节流通常直接写入文件,不涉及内部缓冲区的刷新问题;而 FileWriter 等字符流则依赖内部的字符编码转换和缓冲,必须通过 flush() 来确保字符被正确转换为字节并写出。这种差异源于字符流需要处理 Unicode 到本地编码的转换,而字节流直接处理原始字节。

import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
public class StreamDemo {
public static void main(String[] args) throws IOException {
// 字节流示例:直接写入,无内部缓冲
try (FileOutputStream fos = new FileOutputStream("byte.txt")) {
fos.write(65); // 直接写入底层
}
// 字符流示例:需要 flush
try (FileWriter fw = new FileWriter("char.txt")) {
fw.write('A');
fw.flush(); // 确保字符转换为字节并写出
}
}
}显式调用 flush 的时机与作用
在实际开发中,显式调用 flush() 主要用于确保数据实时输出,特别是在交互式程序或网络通信中。如果不及时刷新,数据可能滞留在缓冲区中,导致接收方无法立即获取。此外,flush() 不会关闭流,仅清空缓冲区,因此可以在多次 write 之间调用以分批输出数据。
立即学习“Java免费学习笔记(深入)”;

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FlushDemo {
public static void main(String[] args) throws IOException {
try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("buffered.txt"))) {
bos.write(65);
bos.flush(); // 强制刷新缓冲区
bos.write(66);
// 不调用 flush,数据可能仍留在缓冲区
}
}
}


















