FileOutputStream用于原样写入字节,适用于二进制文件(如图片)和编码一致的文本;写文本需手动转码并处理换行;写二进制文件推荐分块读写;注意覆盖/追加模式、路径预创建及乱码根源。

使用 FileOutputStream 向本地文件(如文本或图片)写入字节,核心是把原始字节数据通过输出流写入指定路径的文件。它不处理字符编码或图片格式解析,只负责“原样写入字节”,因此适用于二进制文件(如图片、音频)和纯字节文本(需注意编码一致性)。
写入文本内容(需手动处理编码)
FileOutputStream 本身不支持字符串直接写入,必须先将字符串按指定编码转为字节数组:
- 用
String.getBytes("UTF-8")获取 UTF-8 编码的字节(推荐显式指定编码,避免平台默认差异) - 调用
write(byte[])写入全部字节;若需换行,要手动添加"\n".getBytes("UTF-8") - 务必调用
close()或使用 try-with-resources 自动释放资源,否则可能写入不完整
示例:
try (FileOutputStream fos = new FileOutputStream("note.txt")) {byte[] data = "你好,世界!".getBytes("UTF-8");
fos.write(data);
} catch (IOException e) {
e.printStackTrace();
}
写入图片等二进制文件(推荐方式)
图片、PDF、ZIP 等本身就是字节序列,适合直接用 FileOutputStream 写入:
- 从网络、内存或另一个输入流(如
FileInputStream)读取原始字节 - 用
write(byte[], offset, length)分块写入,避免大文件内存溢出 - 无需关心文件类型或编码,只要字节正确,写入后就能正常打开
示例(复制图片):
try (FileInputStream fis = new FileInputStream("src.jpg");FileOutputStream fos = new FileOutputStream("dst.png")) {
byte[] buf = new byte[8192];
int len;
while ((len = fis.read(buf)) != -1) {
fos.write(buf, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
}
注意事项与常见问题
几个关键细节容易出错:
-
覆盖 vs 追加:构造
FileOutputStream(file)默认覆盖;如需追加,用new FileOutputStream(file, true) -
路径不存在:父目录必须已存在,否则抛
FileNotFoundException;可用file.getParentFile().mkdirs()预创建 -
中文乱码:不是
FileOutputStream的问题,而是读取端用了错误编码(如用 GBK 打开 UTF-8 写入的文本) -
性能建议:小量数据可直接
write(byte[]);大量数据务必分块读写,并考虑加BufferedOutputStream提升效率
替代方案提醒
如果目标是写文本,更常用且安全的方式是用 Files.write()(Java 7+)或 PrintWriter:
-
Files.write(Paths.get("a.txt"), "内容".getBytes(StandardCharsets.UTF_8))—— 简洁、自动处理路径和关闭 -
PrintWriter pw = new PrintWriter(new FileWriter("b.txt", StandardCharsets.UTF_8))—— 支持println()、自动编码、更面向文本 -
FileOutputStream主要用于底层字节操作,比如加密后写入、协议包组装、图像像素数据写入等场景

















