Java NIO.2通过Files支持符号链接和硬链接:符号链接可跨文件系统、目标可不存在,用createSymbolicLink创建;硬链接仅限同一文件系统且目标必须存在,用createLink创建;isSymbolicLink、readSymbolicLink和isSameFile用于识别与检测,NOFOLLOW_LINKS控制是否跟随链接。

Java NIO.2(自 Java 7 起)通过 java.nio.file.Files 提供了对符号链接(软链接)和硬链接的原生支持,但要注意:是否成功取决于底层操作系统和文件系统是否允许,且调用时需有对应权限。
创建符号链接(软链接)
符号链接是一个独立文件,内容是目标路径的字符串。它可跨文件系统,目标可以不存在,也能指向目录。
- 使用
Files.createSymbolicLink(link, target)创建 -
link是新链接的路径,target是目标路径(可为相对或绝对) - 若不支持(如 Windows FAT32 或权限不足),会抛
UnsupportedOperationException或IOException - 可选传入
FileAttribute设置权限(如 POSIX 权限)
示例:
Path link = Paths.get("/tmp/mylink");
Path target = Paths.get("/home/user/doc.txt");
try {
Files.createSymbolicLink(link, target);
} catch (IOException | UnsupportedOperationException e) {
System.err.println("无法创建符号链接:" + e.getMessage());
}创建硬链接
硬链接不是独立文件,而是同一 inode 的另一个目录项。它只能指向普通文件、不能跨分区、目标必须已存在。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 调用
Files.createLink(link, target) -
target必须是已存在的普通文件,否则抛IOException - 若
link和target不在同一文件系统,会报IOException: Invalid cross-device link - 不能对目录创建硬链接(绝大多数系统禁止,Java 也不支持)
示例:
Path hardlink = Paths.get("/tmp/hard-ref");
Path original = Paths.get("/home/user/data.bin");
try {
Files.createLink(hardlink, original); // original 必须已存在
} catch (IOException e) {
System.err.println("硬链接创建失败:" + e.getMessage());
}检测与识别链接
区分链接类型和判断是否指向同一文件,是管理的关键环节。
-
Files.isSymbolicLink(path)→ 返回true仅当该路径本身是符号链接 -
Files.readSymbolicLink(path)→ 获取符号链接所指向的目标路径(仅对符号链接有效) -
Files.isSameFile(p1, p2)→ 判断两个路径是否指向同一物理文件(自动解析符号链接,比较 inode 或文件 ID),适用于检测硬链接关系 - 注意:
Path.equals()或字符串比较无效,它们只比路径字面值
操作时控制是否跟随链接
默认情况下,多数 Files 方法(如 readAttributes、isRegularFile)会自动跟随符号链接。如需绕过,传入 LinkOption.NOFOLLOW_LINKS。
- 例如:
Files.getAttribute(path, "basic:lastModifiedTime", NOFOLLOW_LINKS)读取链接文件自身的属性,而非目标文件 - 类似地,
Files.delete()默认删目标;加NOFOLLOW_LINKS才只删链接本身 -
Files.exists(path, NOFOLLOW_LINKS)可判断链接是否存在,而不关心目标是否有效
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










