Files.write()写入字节数组需传Path对象,自动创建/清空文件但不建父目录,须预调Files.createDirectories();默认覆盖,追加需显式指定APPEND;大文件易OOM,应分块写。

Files.write() 写入字节数组的基本用法
可以直接用 Files.write() 把 byte[] 一次性写入文件,无需手动打开流或 flush —— 这是它最常用也最安全的场景之一。
核心调用形式只有一行:Files.write(path, bytes)。它默认使用 StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING,即:文件不存在就创建,存在就清空重写。
- 必须传入
Path对象,不能是String路径字符串(否则编译不通过) -
bytes为空数组(new byte[0])也会成功写入空文件 - 若目标目录不存在,会抛出
NoSuchFileException,不会自动创建父目录
写入前必须确保父目录存在
这是生产环境最容易翻车的地方:Files.write() 不处理路径中的中间目录,哪怕只差一级,也会直接失败。
正确做法是提前调用 Files.createDirectories():
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
Path path = Paths.get("logs/app/data.bin");
Files.createDirectories(path.getParent()); // ← 关键一步
Files.write(path, data);
-
createDirectories()是幂等的,重复调用无副作用 - 不要用
createDirectory()(少了个 s),它不递归,遇到多级缺失路径会报错 - 如果父目录权限不足,异常是
AccessDeniedException,不是IOException的模糊提示
覆盖、追加与权限控制的区别
默认行为是覆盖写入;要追加就得显式传参,且追加时不能带 TRUNCATE_EXISTING —— 否则逻辑自相矛盾。
- 追加写入:
Files.write(path, bytes, StandardOpenOption.CREATE, StandardOpenOption.APPEND) - 写入时设只读权限(Linux/macOS 有效):
Files.write(path, bytes, PosixFilePermission.OWNER_READ, PosixFilePermission.OWNER_WRITE) - Windows 下
PosixFilePermission无效,会静默忽略;要用FileAttribute配合DosFileAttributeView - 如果指定了
StandardOpenOption.WRITE但没配CREATE或CREATE_NEW,文件不存在时直接抛NoSuchFileException
大文件写入时的隐含风险
Files.write() 底层仍会把整个 byte[] 加载进内存,再一次性刷盘。它不流式处理,所以别拿它写几百 MB 的数组。
- 写入 500MB 字节数组 → JVM 堆里至少临时多出 500MB 对象,容易触发 GC 甚至
OutOfMemoryError - 没有进度反馈、无法中断,出错时只能重来
- 真正的大文件应改用
Files.newOutputStream()+BufferedOutputStream分块写 - 如果
bytes来自InputStream.readAllBytes(),注意后者在 JDK 9+ 才有,且同样吃内存
父目录是否存在、字节数组是否真有必要全量加载进内存——这两个点,比语法本身更常决定成败。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










