Files.size和Files.exists仅分别获取文件大小与存在性,不提供权限或完整元数据;需用Files.readAttributes读取basic/posix/dos属性视图,或用Files.isReadable等方法轻量检查权限。

Files.size 和 Files.exists 是 Java NIO.2 中用于快速判断文件基础状态的工具方法,但它们**不提供权限信息或完整元数据**——只能分别获取大小和存在性。要读取权限、创建时间、最后修改时间等,需配合 Files.getAttribute 或 Files.readAttributes 使用。
一、Files.size:安全获取文件大小(仅普通文件)
该方法返回 long 类型字节数,但有重要限制:
- 只适用于普通文件(regular file),对目录、符号链接、设备文件等会抛出
IOException - 不检查读取权限,若无权限访问文件内容(如被拒绝),仍可能抛出异常
- 不会自动解析符号链接,而是读取链接文件本身的大小(即路径字符串长度)
示例:
Path path = Paths.get("data.txt");
try {
long size = Files.size(path); // 成功则返回字节数
System.out.println("文件大小:" + size);
} catch (IOException e) {
System.err.println("无法获取大小:" + e.getMessage());
}
二、Files.exists:判断路径是否存在(可选跟随符号链接)
默认不追踪符号链接(即只检查路径本身是否存在),可通过第二个参数控制行为:
立即学习“Java免费学习笔记(深入)”;
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
-
Files.exists(path)→ 等价于Files.exists(path, LinkOption.NOFOLLOW_LINKS) -
Files.exists(path, LinkOption.NOFOLLOW_LINKS)→ 只检查路径节点是否存在,不解析链接目标 -
Files.exists(path, LinkOption.FOLLOW_LINKS)→ 若是有效符号链接,会检查其指向的目标是否存在
注意:它不区分“不存在”和“无访问权限”,二者都返回 false。如需区分,应捕获 SecurityException 或用 Files.getAttribute 尝试读取基础属性。
三、获取权限与完整元数据:必须用 Files.readAttributes
Java 中权限(如 rwx)、时间戳、文件类型等属于“文件属性”,需通过属性视图(view)读取。常用的是:
- basic 视图:包含 lastModifiedTime、lastAccessTime、creationTime、isDirectory、isRegularFile、isSymbolicLink、size、fileKey 等
-
posix 视图(Linux/macOS/部分Windows):额外提供 owner、group、permissions(如
PosixFilePermission.OWNER_READ) - dos 视图(Windows):提供 archive、hidden、readonly、system 等 DOS 属性
示例(POSIX 权限):
Path path = Paths.get("script.sh");
try {
BasicFileAttributes basic = Files.readAttributes(path, BasicFileAttributes.class);
System.out.println("大小:" + basic.size());
System.out.println("最后修改:" + basic.lastModifiedTime());
// 仅在支持 POSIX 的系统上可用
PosixFileAttributes posix = Files.readAttributes(path, PosixFileAttributes.class);
System.out.println("所有者:" + posix.owner());
System.out.println("权限:" + posix.permissions());
} catch (IOException e) {
System.err.println("读取属性失败:" + e.getMessage());
}
四、权限检查的替代方式:Files.isReadable / isWritable / isExecutable
如果只需判断当前 JVM 进程是否有某项权限,比解析 POSIX 权限更轻量:
-
Files.isReadable(path)—— 检查是否可读(含执行权对目录的意义) -
Files.isWritable(path)—— 检查是否可写 -
Files.isExecutable(path)—— 检查是否可执行(Windows 上对 .exe/.bat 等有效;Linux/macOS 对具有 x 权限的文件有效)
这些方法底层调用操作系统 API,返回 boolean,不抛异常,适合做前置校验。

















