文章目录
- [403. Java 文件操作基础 - 写入二进制文件](#403. Java 文件操作基础 - 写入二进制文件)
-
- [1️⃣ 背景说明](#1️⃣ 背景说明)
- [2️⃣ 示例代码:写入日志文件](#2️⃣ 示例代码:写入日志文件)
- [3️⃣ 🔹 说明](#3️⃣ 🔹 说明)
- [4️⃣ 🔹 扩展示例:多行追加写入](#4️⃣ 🔹 扩展示例:多行追加写入)
- [5️⃣ 总结](#5️⃣ 总结)
403. Java 文件操作基础 - 写入二进制文件
1️⃣ 背景说明
Java NIO提供了Files.newOutputStream(Path, OpenOption...)方法,用于 创建或写入文件。- 这个方法返回一个 未缓冲的
OutputStream,可用于写入二进制数据。 - 可以通过可选参数
OpenOption指定文件的写入方式:- CREATE:文件不存在时创建
- TRUNCATE_EXISTING:文件存在时清空
- APPEND:追加到文件末尾
默认行为:如果文件不存在,则创建;如果文件存在,则清空。等价于
CREATE + TRUNCATE_EXISTING。
2️⃣ 示例代码:写入日志文件
java
import static java.nio.file.StandardOpenOption.*;
import java.nio.file.*;
import java.io.*;
public class LogFileTest {
public static void main(String[] args) {
String s = "Hello World! ";
byte[] data = s.getBytes(); // 将字符串转换为字节数组
Path p = Paths.get("./logfile.txt"); // 日志文件路径
// try-with-resources 自动关闭流
try (OutputStream out = new BufferedOutputStream(
Files.newOutputStream(p, CREATE, APPEND))) {
out.write(data, 0, data.length); // 写入字节数据
System.out.println("写入完成: " + s);
} catch (IOException x) {
System.err.println("写入文件异常: " + x);
}
}
}
3️⃣ 🔹 说明
- BufferedOutputStream
- 用于缓冲写入,提高写入效率,减少磁盘 I/O 调用。
- OpenOption 参数
CREATE:不存在则创建APPEND:存在时追加- 可组合使用,如:
CREATE, TRUNCATE_EXISTING→ 覆盖写入
- 字节数组写入
write(byte[] b, int off, int len)写入指定范围的字节- 可直接写整个数组,也可以写部分数据
- try-with-resources
- 自动关闭流,避免资源泄漏
- 异常发生时,流依然会被正确关闭
4️⃣ 🔹 扩展示例:多行追加写入
java
String[] lines = {"第一行日志", "第二行日志", "第三行日志"};
try (OutputStream out = new BufferedOutputStream(
Files.newOutputStream(p, CREATE, APPEND))) {
for (String line : lines) {
out.write((line + System.lineSeparator()).getBytes());
}
} catch (IOException x) {
System.err.println(x);
}
System.lineSeparator()自动获取平台换行符,保证跨平台兼容性。- 每次循环将一行追加到文件末尾。
5️⃣ 总结
✅ 创建/写入文件常见方式:
- 新建文件:
CREATE - 覆盖写入:
TRUNCATE_EXISTING - 追加写入:
APPEND
✅ BufferedOutputStream vs OutputStream
- 缓冲流效率更高
- 对大文件写入尤其有用
✅ 异常处理
- IO 操作容易出错,务必使用 try-with-resources + catch 捕获异常
- 保证资源关闭,防止文件句柄泄漏
✅ 字节流 vs 字符流
- OutputStream 写字节 → 二进制或编码后的文本
- Writer 写字符 → 文本文件,自动处理字符编码