跳转到主内容
极星编程网:以代码为星,赴技术山海!

如何在 Java 中通过 Files.write() 方法直接将字节数组一次性写入文件

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免费学习笔记(深入) ”; Eclipse导入Android或其他的JAVA项目的正确方法 WORD版 本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看 下载
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+ 才有,且同样吃内存 父目录是否存在、字节数组是否真有必要全量加载进内存——这两个点,比语法本身更常决定成败。

相关文章