本教程适用于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
。