Files.isReadable()是检查文件读取权限最简洁可靠的方式,返回true表示文件存在、为常规文件且当前用户有读取权限;false则表明文件不存在、是目录、不可访问或被拒绝读取,适合前置校验但不能替代异常处理。

直接调用 Files.isReadable() 是检查文件读取权限最简洁可靠的方式,但它只反映“当前 JVM 进程所代表的用户”是否具备读取该文件的权限,不保证后续打开流一定成功(比如文件可能被其他进程锁定、路径是符号链接且目标不可达等)。它适合做快速前置校验,但不能替代异常处理。
基本用法:判断文件是否可读
传入一个 Path 对象,返回 boolean:
- 返回
true表示:文件存在、是常规文件(非目录)、且当前用户有读取权限(POSIX 权限或 Windows ACL 允许) - 返回
false表示:文件不存在、是目录、不可访问、或明确拒绝读取 —— 此时几乎肯定无法创建FileInputStream
典型检查 + 打开流的安全写法
建议结合 isReadable() 和 try-with-resources,既提前过滤明显失败场景,又保留对运行时异常(如 `SecurityException`、`IOException`)的兜底处理:
Path path = Paths.get("/path/to/file.txt");
if (!Files.isReadable(path)) {
throw new IllegalArgumentException("文件不可读:" + path);
}
try (FileInputStream fis = new FileInputStream(path.toFile())) {
// 安全使用输入流
} catch (IOException e) {
// 处理实际打开失败(例如文件被占用、磁盘错误等)
}
注意几个常见误区
-
不检查文件是否存在:如果路径不存在,
isReadable()直接返回false,但你可能需要区分“不存在”和“存在但不可读”。可用Files.exists(path)单独判断 -
不适用于符号链接目标验证:默认检查的是链接本身(若为符号链接且可读),而非其指向的目标。如需检查目标,加
LinkOption.NOFOLLOW_LINKS参数控制 -
不代替安全策略检查:JVM 若启用了安全管理器(已过时但仍有遗留环境),即使
isReadable()返回true,打开流时仍可能抛出SecurityException
与传统 File.canRead() 的区别
Files.isReadable() 更严格、更符合现代文件系统语义:
- 对符号链接、挂载点、特殊文件系统(如 /proc)行为更一致
- 底层调用 OS 原生接口(如 Linux 的
access(2)),比File.canRead()的 Java 层模拟更准确 - 推荐在 NIO.2 路径操作中统一使用
Files.*工具方法










