# 链接，符号或其他

> 原文： [https://docs.oracle.com/javase/tutorial/essential/io/links.html](https://docs.oracle.com/javase/tutorial/essential/io/links.html)

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

到目前为止的讨论一直是[符号或 _ 软 _ 链接](path.html#symlink)，但有些文件系统也支持硬链接。 _ 硬链接 _ 比符号链接更具限制性，如下所示：

*   链接的目标必须存在。
*   目录上通常不允许使用硬链接。
*   不允许硬链接跨越分区或卷。因此，它们不能跨文件系统存在。
*   硬链接看起来和行为像常规文件一样，因此很难找到它们。
*   对于所有意图和目的，硬链接是与原始文件相同的实体。它们具有相同的文件权限，时间戳等。所有属性都相同。

由于这些限制，硬链接不像符号链接那样频繁使用，但`Path`方法与硬链接无缝协作。

有几种方法专门处理链接，并在以下部分中介绍：

*   [创建符号链接](#symLink)
*   [创建硬链接](#hardLink)
*   [检测符号链接](#detect)
*   [寻找链接目标](#read)

如果您的文件系统支持它，您可以使用 [`createSymbolicLink(Path, Path, FileAttribute&lt;?&gt;)`](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#createSymbolicLink-java.nio.file.Path-java.nio.file.Path-java.nio.file.attribute.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)`](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#createLink-java.nio.file.Path-java.nio.file.Path-) 方法创建到现有文件的硬（或 _ 常规 _）链接。第二个`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)`](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#isSymbolicLink-java.nio.file.Path-) 方法。以下代码段显示了如何：

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

```

有关更多信息，请参阅[管理元数据](fileAttr.html)。

您可以使用 [`readSymbolicLink(Path)`](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#readSymbolicLink-java.nio.file.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`。