OutputStream是Java中用于写入原始字节的抽象基类,需通过FileOutputStream等子类使用,提供write(int)、write(byte[])等方法写入数据,写文本时应显式指定编码或使用OutputStreamWriter。

Java 中使用 OutputStream 写入字节,本质是把原始的二进制数据(byte)写入目标(如文件、网络连接、内存等)。它不关心内容是什么编码、是不是文本——只管“一个字节一个字节地送出去”。
OutputStream 是抽象基类,不能直接 new
必须用它的具体子类,常见有:
-
FileOutputStream:写入文件 -
ByteArrayOutputStream:写入内存字节数组(常用于中间缓存或构造数据) -
BufferedOutputStream:加缓冲的包装流,提升频繁小写入的性能 -
DataOutputStream:支持写入基本类型(int、double等)和字符串(按 UTF-8 编码)
基础写入方式:write() 方法
三个常用重载方法:
-
write(int b):写入单个字节(注意:参数是int,但只取低 8 位,即b & 0xFF) -
write(byte[] b):写入整个字节数组 -
write(byte[] b, int off, int len):写入数组中从off开始的len个字节
示例(写入文件):
立即学习“Java免费学习笔记(深入)”;
try (FileOutputStream fos = new FileOutputStream("data.bin")) {
// 写入单个字节:0x41(即 'A')
fos.write(65);
// 写入字节数组
byte[] data = {72, 101, 108, 108, 111}; // "Hello"
fos.write(data);
// 或指定范围
fos.write(data, 1, 3); // 写入 "ell"
}
字符流 vs 字节流:别混用
OutputStream 是纯字节流,不能直接写 String 或 char。如果想写文本,必须先转成字节:
- 用
String.getBytes()(默认平台编码,不推荐) - 显式指定编码,如
str.getBytes(StandardCharsets.UTF_8) - 更稳妥的方式:用
OutputStreamWriter(字符流桥接器),它内部自动完成字符→字节转换
错误示范(看似简洁,实则隐患大):
fos.write("你好".getBytes()); // 用系统默认编码,跨环境可能乱码
推荐写法:
fos.write("你好".getBytes(StandardCharsets.UTF_8));
// 或搭配 OutputStreamWriter:
try (OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8)) {
osw.write("你好");
}
记得 flush 和 close
多数 OutputStream 子类(尤其是带缓冲的)会暂存数据,调用 flush() 强制写出;close() 会自动 flush() 并释放资源。建议用 try-with-resources 自动管理。
手动管理时注意:
- 未
flush()可能导致部分数据滞留在缓冲区,没真正写入目标 - 未
close()可能造成资源泄漏(如文件句柄未释放)


















