文档

Java™ 教程
隐藏目录
链接,符号或其他
路径:基本Java类
课程:基本I/O
章节:文件I/O(使用NIO.2)

链接,无论是符号还是其他

正如之前提到的,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


上一页: 创建和读取目录
下一页: 遍历文件树