Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
如前所述,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
。