Files.isSameFile(Path, Path)是最直接可靠的方法,通过底层文件系统标识符(如inode+device ID)判断两个路径是否指向同一物理文件,自动解析符号链接,要求路径必须存在且可访问。

用 Files.isSameFile(Path, Path) 最直接可靠。
判断硬链接或同一文件的首选方法
这个方法不比较路径字符串,也不读取文件内容,而是通过底层文件系统标识符(如 Unix 的 inode + device ID,Windows NTFS 的 File ID)判断两个路径是否指向同一个物理文件。它自动解析符号链接,只比对最终目标。
- 支持 Java 7 及以上,Java 17 中已稳定且跨平台
- 无需额外依赖,不涉及 JNI 或外部命令
- 即使两个路径是不同名字、不同目录下的硬链接,也能准确返回 true
使用前要注意的几点
该方法要求两个路径都必须存在且可访问,否则会抛出 IOException 或返回 false(不是异常,而是逻辑结果)。
- 如果任一路径不存在、无权限、是断开的符号链接,
isSameFile通常返回false - 不能用于判断“内容相同”,只判断“是否同一份数据在磁盘上的多个入口”
- 对软链接(symbolic link)会自动追踪到目标再比较,不是比链接文件本身
对比其他常见误用方式
仅靠路径字符串相等(path1.equals(path2))、文件大小一致、修改时间相同,甚至 MD5 哈希一致,都不能等价于“底层相同”。
立即学习“Java免费学习笔记(深入)”;
-
Path.equals():只看字符串,/a/b.txt和./a/b.txt就不等 - 文件大小/时间:多个不同文件可能偶然相同
- MD5/SHA 等哈希:能说明内容一致,但无法区分是硬链接还是独立复制的副本
简单示例代码
(Java 17+ 推荐写法)
import java.nio.file.*;
Path p1 = Paths.get("/home/user/doc.txt");
Path p2 = Paths.get("/home/user/alias.txt");
try {
boolean same = Files.isSameFile(p1, p2);
System.out.println("是否指向同一物理文件: " + same); // true 表示是硬链接或同一路径
} catch (IOException e) {
System.err.println("路径不可访问: " + e.getMessage());
}


















