files.readallbytes 是 java nio 中专用于小文件(建议几 mb 内)的一次性字节读取方法,自动关闭资源,但需手动处理编码转换,不适用于大文件或路径不可读场景。

Files.readAllBytes 是 Java NIO 中最简洁高效的小文件读取方式,适合几百 KB 以内的文本或二进制文件,它会把整个文件内容一次性加载到 byte[] 中,省去流式处理的繁琐步骤。
适用场景和前提条件
该方法只适用于确定“小文件”的场景——比如配置文件、JSON 模板、证书、图标等,通常建议控制在几 MB 以内。JVM 需要为整个文件分配连续内存空间,过大会引发 OutOfMemoryError 或显著影响 GC 表现。
- 文件路径必须存在且可读(否则抛出
IOException) - 不支持带编码参数,返回的是原始字节,若读文本需后续用
new String(bytes, StandardCharsets.UTF_8)转换 - 内部自动使用 try-with-resources 关闭通道,无需手动管理资源
基础用法示例
只需一行核心代码即可完成读取:
Path path = Paths.get("config.json");
byte[] content = Files.readAllBytes(path); // 直接获取全部字节
String text = new String(content, StandardCharsets.UTF_8); // 如需字符串
如果路径不存在或无权限,会直接抛出 IOException,建议配合 try-catch 使用:
try {
byte[] data = Files.readAllBytes(Paths.get("data.bin"));
// 处理二进制数据
} catch (IOException e) {
System.err.println("读取失败:" + e.getMessage());
}
常见注意事项
虽然写法简单,但几个细节容易踩坑:
- 不能用于超大文件(如视频、日志归档),应改用
Files.lines()或BufferedReader流式读取 - 读取后 byte[] 不可变,如需修改内容请复制新数组或转为
ByteBuffer - Windows 路径中的反斜杠(
\)需转义或用正斜杠(/),推荐统一用Paths.get("a/b/c.txt")构造 - 多线程环境下注意:方法本身是线程安全的,但共享的 Path 对象若被并发修改可能出问题
对比其他读取方式
相比传统 FileInputStream + ByteArrayOutputStream 手动拼接,readAllBytes 更安全、更少出错;相比 Files.readString(Java 11+),它保留了原始字节,更适合处理非文本内容(如图片、加密密钥)。
若明确读文本且 JDK ≥ 11,Files.readString(path, UTF_8) 更直观;若需兼容旧版本或处理二进制,readAllBytes 仍是首选。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











