Java 7+ 通过 Files.createSymbolicLink() 支持跨目录软链接创建,关键在目标路径的绝对性/相对性、系统权限及文件系统支持(如非FAT32);硬链接则需 Files.createLink() 且目标必须存在、同文件系统。

Java 本身不直接支持创建硬链接(hard link)或软链接(symbolic link)的跨平台 API,但自 Java 7 起,java.nio.file.Files 提供了 createSymbolicLink 方法用于创建软链接;而硬链接仅在支持的文件系统(如 ext4、NTFS)上可通过 createLink 创建,且有严格限制。
创建软链接(symbolic link)
软链接是一个指向目标路径的特殊文件,类似快捷方式。目标可以不存在,也可以是目录,且支持跨文件系统。
- 使用
Files.createSymbolicLink(),需传入链接路径和目标路径(用Path表示) - 目标路径建议用绝对路径,避免相对路径引发歧义
- 需要运行环境具备创建符号链接的权限(Linux/macOS 通常需普通用户权限;Windows 自 Windows 10 1703 起需启用“开发者模式”或以管理员身份运行)
示例:
Path link = Paths.get("/home/user/mylink");
Path target = Paths.get("/home/user/original.txt");
try {
Files.createSymbolicLink(link, target);
} catch (IOException e) {
e.printStackTrace();
}
创建硬链接(hard link)
硬链接是同一文件的多个目录项入口,共享相同的 inode 和数据块。它只能指向普通文件,不能跨文件系统,也不能指向目录(Linux 等系统中 root 用户除外,但 Java 不支持)。
立即学习“Java免费学习笔记(深入)”;
- 调用
Files.createLink(),参数为链接路径和目标文件路径 - 目标必须是已存在的普通文件,否则抛出
IOException - 链接与目标必须位于同一文件系统(即同一分区),否则会报
IOException: Invalid cross-device link
示例:
Path link = Paths.get("/home/user/hardlink");
Path target = Paths.get("/home/user/original.txt"); // 必须已存在
try {
Files.createLink(link, target);
} catch (IOException e) {
e.printStackTrace();
}
注意事项和常见问题
实际使用中容易忽略权限、路径语义和平台差异:
- Windows 默认禁止非管理员创建符号链接,可开启“开发者模式”或使用
mklink命令验证环境是否支持 -
createLink在 macOS 上对普通用户不可用(仅支持硬链接到文件,且需文件系统支持,APFS/HFS+ 支持但受限) - 判断链接类型可用
Files.isSymbolicLink(path)或Files.getAttribute(path, "basic:isSymbolicLink") - 读取软链接目标路径用
Files.readSymbolicLink(path);硬链接无法直接反查所有链接路径(需用外部工具如find -inum)
替代方案:委托系统命令(不推荐但可行)
若 NIO 方法失败(如权限不足或旧版 JDK),可调用系统命令,但丧失可移植性与安全性:
- Linux/macOS:
Runtime.getRuntime().exec("ln -s target link")或ln target link - Windows:
cmd /c mklink /D link target(目录)或mklink link target(文件) - 务必校验命令返回值、处理异常输出,并注意路径空格与转义
不复杂但容易忽略权限和平台约束,优先使用 Files.createSymbolicLink 和 Files.createLink,再根据错误信息降级处理。


















