应先用Files.isSymbolicLink(path)判断是否为符号链接,再结合Files.isDirectory(path)区分真实目录;两者不互斥但语义明确,需配合exists检查路径存在性以防异常。

直接用 Files.isSymbolicLink(path) 判断是否为符号链接,再配合 Files.isDirectory(path) 区分真实目录——两者不互斥,但语义明确。
先确认是不是符号链接
这是最直接的判断方式。只要路径存在且是符号链接,Files.isSymbolicLink() 就返回 true,无需关心它指向的是文件还是目录。
- 即使符号链接最终指向一个目录,
isSymbolicLink()仍为 true - 如果路径不存在或不是符号链接,该方法返回 false
- 调用时可能抛出
IOException(如权限不足),需捕获处理
再判断是否为真实目录
Files.isDirectory(path) 默认不跟随符号链接,只对路径本身是否为“实际存在的目录”做判断:
- 若路径是真实目录(非链接),返回 true
- 若路径是符号链接(无论指向什么),默认返回 false
- 若想让它跟随链接并检查目标是否为目录,需显式传入
LinkOption.NOFOLLOW_LINKS以外的选项(但通常不推荐,会模糊“真实目录”的定义)
组合使用才能准确分类
单靠一个方法无法覆盖全部情况。典型逻辑如下:
立即学习“Java免费学习笔记(深入)”;
-
Files.isSymbolicLink(p) == true→ 是符号链接(不管它指向哪) -
Files.isSymbolicLink(p) == false && Files.isDirectory(p) == true→ 是真实目录 -
Files.isSymbolicLink(p) == false && Files.isDirectory(p) == false && Files.isRegularFile(p) == true→ 是普通文件 - 三者都为 false → 路径不存在,或为设备文件、命名管道等特殊实体
注意路径存在性是前提
所有 Files.xxx 方法都要求路径在文件系统中存在,否则多数会抛出 NoSuchFileException。安全做法是先用 Files.exists(p) 做兜底检查,避免异常打断流程。


















