403. Java 文件操作基础 - 写入二进制文件

文章目录

  • [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️⃣ 🔹 说明

  1. BufferedOutputStream
    • 用于缓冲写入,提高写入效率,减少磁盘 I/O 调用。
  2. OpenOption 参数
    • CREATE:不存在则创建
    • APPEND:存在时追加
    • 可组合使用,如:CREATE, TRUNCATE_EXISTING → 覆盖写入
  3. 字节数组写入
    • write(byte[] b, int off, int len) 写入指定范围的字节
    • 可直接写整个数组,也可以写部分数据
  4. 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 写字符 → 文本文件,自动处理字符编码
相关推荐
BBmmo4 分钟前
我的 Java 学习笔记 · 第 11 篇:Condition.await 为什么必须放在 while 里
java
SimonKing7 分钟前
一只离线鼠鼠,干翻了一堆在线格式转换网站
java·后端·程序员
程序员-Benothing8 分钟前
Linux文本排序统计命令:sort、uniq、wc、cut、tr实战
java·开发语言·算法
clz13145218 分钟前
双重检查锁 DCL 终极优化:懒加载 + 线程安全 + 高性能
java
CRMEB9 分钟前
前后端技术栈全面换代!CRMEB 多商户(Java)v3.0更新预告
java·开发语言
开发者联盟league10 分钟前
c++11 使用chrono库转换时间点和字符串,计算时间点间隔
java·c++·算法
我最爱吃鱼香茄子14 分钟前
【毕业设计优选】人力资源管理系统|Java|SpringBoot|Vue|前后端分离|带详细文档+部署教学视频
java·vue·毕业设计·springboot
溪语流沙18 分钟前
【Web全栈进阶】JWT无状态认证:签发、校验、刷新
前端·git·python·github
JQLvopkk18 分钟前
HslCommunication,一个工具测遍所有 PLC
开发语言·人工智能·c#·交互
reasonsummer22 分钟前
【办公类-112-08】20261009园园通信息合并配学号拆班(数据更新,用年月日期区分版本)
python