文档

Java™ 教程-Java Tutorials 中文版
链接,符号或其他
Trail: Essential Classes
Lesson: Basic I/O
Section: File I/O (Featuring NIO.2)

链接,符号或其他

如前所述,java.nio.file 包,特别是 Path 类是“链接感知的”。每个 Path 方法都会检测遇到符号链接时要执行的操作,或者它提供了一个选项,使你可以配置在遇到符号链接时行为。

到目前为止的讨论是关于 symbolic or soft links,但有些文件系统也支持硬链接。Hard links 比符号链接更具限制性,如下所示:

由于这些限制,硬链接不像符号链接那样频繁使用,但 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) {
    // Some file systems do not support symbolic links.
    System.err.println(x);
}

使用 FileAttributes vararg 可以指定在创建链接时以原子方式设置的初始文件属性。但是,此参数仅供将来使用,目前尚未实现。

创建硬链接

你可以使用 createLink(Path, Path) 方法创建指向现有文件的硬(或 regular)链接。第二个 Path 参数定位现有文件,它必须存在否则会抛出 NoSuchFileException。以下代码段显示了如何创建链接:

Path newLink = ...;
Path existingFile = ...;
try {
    Files.createLink(newLink, existingFile);
} catch (IOException x) {
    System.err.println(x);
} catch (UnsupportedOperationException x) {
    // Some file systems do not
    // support adding an existing
    // file to a directory.
    System.err.println(x);
}

检测符号链接

要确定 Path 实例是否为符号链接,可以使用 isSymbolicLink(Path) 方法。以下代码段显示了如何:

Path file = ...;
boolean isSymbolicLink =
    Files.isSymbolicLink(file);

有关更多信息,请参阅 Managing Metadata

寻找链接的目标

你可以使用 readSymbolicLink(Path) 方法获取符号链接的目标,如下所示:

Path link = ...;
try {
    System.out.format("Target of link" +
        " '%s' is '%s'%n", link,
        Files.readSymbolicLink(link));
} catch (IOException x) {
    System.err.println(x);
}

如果 Path 不是符号链接,则此方法抛出 NotLinkException


Previous page: Creating and Reading Directories
Next page: Walking the File Tree