本教程适用于JDK 8。本页面中描述的示例和实践不利用后续版本中引入的改进,并且可能使用已不再可用的技术。
请参阅Java语言变化,了解Java SE 9及后续版本中更新的语言特性的摘要。
请参阅JDK发行说明,了解所有JDK版本中新功能、增强功能以及已删除或弃用选项的信息。
正如之前提到的,java.nio.file包,尤其是Path类是“链接感知”的。每个Path方法要么在遇到符号链接时自动检测该做什么,要么提供一个选项让你配置遇到符号链接时的行为。
到目前为止,讨论的是关于符号或软链接,但一些文件系统也支持硬链接。与符号链接相比,硬链接更加受限制,具体如下:
由于这些限制,硬链接不像符号链接那样经常使用,但Path方法与硬链接无缝地配合工作。
有几个方法专门处理链接,在以下章节中介绍:
如果你的文件系统支持,可以使用createSymbolicLink(Path, Path, FileAttribute<?>)方法创建符号链接。第二个Path参数代表目标文件或目录,可能存在也可能不存在。以下代码片段创建了一个带有默认权限的符号链接:
Path newLink = ...;
Path target = ...;
try {
Files.createSymbolicLink(newLink, target);
} catch (IOException x) {
System.err.println(x);
} catch (UnsupportedOperationException x) {
// 一些文件系统不支持符号链接。
System.err.println(x);
}
FileAttributes可变参数允许你在创建链接时原子地设置初始文件属性。然而,这个参数是为将来使用而预留的,目前尚未实现。
你可以使用createLink(Path, Path)方法创建一个到现有文件的硬链接(也称为常规链接)。第二个Path参数定位到现有文件,它必须存在,否则将抛出NoSuchFileException。以下代码片段展示了如何创建一个链接:
Path newLink = ...;
Path existingFile = ...;
try {
Files.createLink(newLink, existingFile);
} catch (IOException x) {
System.err.println(x);
} catch (UnsupportedOperationException x) {
// 有些文件系统不支持将现有文件添加到目录中。
System.err.println(x);
}
要确定一个 Path 实例是否是符号链接,可以使用 isSymbolicLink(Path) 方法。以下代码片段展示了如何使用该方法:
Path file = ...;
boolean isSymbolicLink =
Files.isSymbolicLink(file);
更多信息请参阅 管理元数据。
您可以使用 readSymbolicLink(Path) 方法获取符号链接的目标,如下所示:
Path link = ...;
try {
System.out.format("链接 '%s' 的目标是 '%s'%n", link,
Files.readSymbolicLink(link));
} catch (IOException x) {
System.err.println(x);
}
如果 Path 不是符号链接,则该方法会抛出 NotLinkException。