Java中Files工具类提供安全高效的文件写入方式:优先用JDK11+的writeString()写字符串(自动编码与资源管理),用write()写字节数组,JDK8则用getBytes()配合write();须预创建父目录、显式指定UTF-8编码、避免选项冲突,并利用临时文件保障原子性。

Java 中 Files 工具类提供了简洁、安全的文件写入方式,核心在于合理选用方法并注意编码与异常处理。高效写入的关键不是“快”,而是避免冗余操作(如手动创建流、重复打开文件)、正确处理字符编码,并利用 NIO.2 的原子性与便捷性。
写字符串:优先用 Files.writeString()(JDK 11+)
这是最直接、最安全的方式,自动处理字符编码和资源关闭,无需手动管理 OutputStreamWriter 或 BufferedWriter。
- 默认使用 UTF-8 编码,显式指定编码更稳妥:
Files.writeString(path, content, StandardCharsets.UTF_8) - 支持追加模式:
Files.writeString(path, content, StandardOpenOption.APPEND) - 若目标目录不存在,需提前创建:
Files.createDirectories(path.getParent())
写字节数组:用 Files.write() 配合标准选项
适用于二进制内容或已编码的字节(如 UTF-8 字节数组),比逐字节写入或包装 OutputStream 更高效。
- 基础写入:
Files.write(path, bytes)—— 覆盖写入,自动创建文件 - 追加写入:
Files.write(path, bytes, StandardOpenOption.APPEND) - 确保父目录存在:
Files.createDirectories(path.getParent())应在 write 前调用 - 避免传入 null 字节数组,否则抛
NullPointerException
兼容 JDK 8 的写法:用 Files.write() + String.getBytes()
JDK 8 没有 writeString,但可通过 write 方法配合显式编码实现等效效果:
立即学习“Java免费学习笔记(深入)”;
Files.write(path, content.getBytes(StandardCharsets.UTF_8))- 务必显式指定编码,避免依赖平台默认编码(如 Windows 的 GBK)导致乱码
- 同样支持
StandardOpenOption.APPEND等选项
注意事项与避坑点
高效的前提是不出错。几个常见问题需主动规避:
- 路径中的父目录不存在时,
Files.write会直接抛NoSuchFileException,必须提前创建 - 写入大字符串或大量数据时,
writeString和write内部已做缓冲优化,无需额外包装BufferedWriter - 不要混用
StandardOpenOption.CREATE和APPEND——APPEND默认隐含 CREATE,显式叠加无意义 - 若需原子性替换(防止写到一半被读),可先写临时文件再
Files.move(tempPath, targetPath, StandardCopyOption.REPLACE_EXISTING)


















