在Java NIO.2里,硬链接是指多个不同的路径名称指向同一个文件索引节点。仅凭字符串比较路径无法确认二者是否为同一文件,因为路径可能被规范化或存在符号链接。Java标准库提供了可靠方式来判断两个路径是否指向同一个硬链接文件。

使用Files.isSameFile方法
最直接的方法是调用Files.isSameFile(Path, Path),它会先尝试按规则解析路径,再判断底层文件是否相同。该方法已经处理了符号链接与文件标识的比较。
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class SameFileCheck {
public static void main(String[] args) throws Exception {
Path p1 = Paths.get("/data/file.txt");
Path p2 = Paths.get("/data/link-to-file.txt"); // 硬链接
boolean same = Files.isSameFile(p1, p2);
System.out.println("是否为同一文件: " + same);
}
}
通过fileKey属性检测
如果需要手动比较,可以读取文件的BasicFileAttributes并获取fileKey。fileKey在同一个文件系统中唯一标识文件,硬链接共享相同的fileKey。
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;
public class FileKeyCheck {
public static void main(String[] args) throws Exception {
Path p1 = Paths.get("/data/file.txt");
Path p2 = Paths.get("/data/link-to-file.txt");
BasicFileAttributes a1 = Files.readAttributes(p1, BasicFileAttributes.class);
BasicFileAttributes a2 = Files.readAttributes(p2, BasicFileAttributes.class);
Object key1 = a1.fileKey();
Object key2 = a2.fileKey();
System.out.println("key相同: " + (key1 != null && key1.equals(key2)));
}
}
注意事项
- fileKey在不同文件系统之间不可比较,跨设备时应使用Files.isSameFile。
- Windows下fileKey通常基于文件索引,Linux下基于inode与设备号。
- 如果路径不存在,上述方法都会抛出NoSuchFileException,需提前判断存在性。
总结
检测两个Java NIO.2路径是否指向同一硬链接文件,优先使用Files.isSameFile。在需要批量比较或缓存标识时,可提取fileKey辅助判断,但必须保证路径位于同一文件系统。
Java_NIO.2硬链接文件路径修改时间:2026-07-31 10:06:13