在java的字节流与字符流体系中,outputstream是位于 java.io 包下的抽象基类,专门用于处理面向字节的输出操作。它是所有字节输出流的父类,定义了将数据写入目标源(如文件、网络套接字)的核心方法,例如 write(int)、write(byte[]) 以及 flush() 和 close()。开发者在使用时,通常不会直接实例化它,而是通过其具体的子类(如 fileoutputstream 或 bufferedoutputstream)来完成实际的i/o任务。

如何创建并写入一个文件?
要创建一个文件并向其中写入内容,最直接的方式是使用 FileOutputStream。该类的构造函数接收一个文件路径字符串,如果文件不存在则会自动创建;如果存在且未指定追加模式,则会覆盖原有内容。调用 write() 方法可以将字节数组或单个整数写入流中,最后必须调用 close() 来释放系统资源。

import java.io.FileOutputStream;
import java.io.IOException;
public class Main {
public static void main(String[] args) {
String path = "test.txt";
byte[] data = "Hello World".getBytes();
try (FileOutputStream fos = new FileOutputStream(path)) {
fos.write(data);
} catch (IOException e) {
e.printStackTrace();
}
}
}如何实现带缓冲的高效写入?
虽然直接使用 FileOutputStream 可以完成写入,但频繁的系统调用会带来性能开销。为了解决这个问题,可以使用装饰器模式将 FileOutputStream 包装在 BufferedOutputStream 中。BufferedOutputStream 内部维护了一个字节缓冲区,当写入的数据量未达到阈值时,数据会先暂存在内存中,直到缓冲区满或手动调用 flush() 时才真正写入磁盘。这种方式显著减少了I/O操作的次数。
立即学习“Java免费学习笔记(深入)”;

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Main {
public static void main(String[] args) {
String path = "test_buffered.txt";
byte[] data = "Hello Buffered World".getBytes();
try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(path))) {
bos.write(data);
} catch (IOException e) {
e.printStackTrace();
}
}
}关闭流时 flush() 行为有何影响?
在基于上述程序验证时发现,BufferedOutputStream 的 close() 方法不仅会关闭底层流,还会自动触发一次 flush() 操作,确保缓冲区内的剩余数据被全部写出。这意味着在 try-with-resources 语句块结束时,即使没有显式调用 flush(),数据也能安全地持久化到文件中。相比之下,如果手动管理流的生命周期而忘记调用 close() 或 flush(),缓冲区中的数据可能会丢失。


















