定义
接口对于根目录的定义如下:
可能还存在一个标识文件系统层次结构的根组件。
因此,你可以看到,这个注释似乎意味着根目录用于文件系统层次结构。现在我们要理解什么是绝对路径。接口告诉我们以下内容:
绝对路径是完整的,它不需要与其他路径信息组合以定位文件。
所以,你可以看到,在关于绝对路径的定义中没有任何关于根目录的提及。唯一的限制是我们必须能够在没有进一步信息的情况下定位文件。
分层文件系统
大多数文件系统都是分层的,即它们是树状结构(如果考虑链接,则为图形)或森林。树中的根是一个未被另一个节点包含的节点(排除链接)。例如,Windows文件系统是森林,因为它们有许多根目录(C:
,D:
等等)。Linux通常只有一个根目录,即/
。根目录非常重要,因为如果没有它,就很难开始定位文件。在这样的文件系统中,你通常可以依赖每个绝对路径都有一个根。
非分层文件系统
只要我们拥有分层文件系统,就可以预期绝对路径中会有一个根目录,但是如果没有呢?那么,绝对路径可能不包含根。
我能想到的一个例子是:像Chord这样的分布式文件系统,它们通常不是分层的,因此根目录的意义通常是未定义的。相反,文件哈希标识了一个文件(在Chord中为SHA-1),因此有效的Chord路径可能看起来像这样:
cf23df2207d99a74fbe169e3eba035e633b65d94
这是一个绝对路径。由于路径是绝对的,因此可以在不需要其他信息的情况下检索相关文件。然而,我没有看到根目录。我们可以定义整个哈希为其自己的根(然后每个文件将成为其自己的根),但是没有人能保证实现Chord文件系统的每个人都同意这一点。因此,可能有合理的实现不将这些哈希视为根。在这样的文件系统中,每个路径都是绝对的,但没有一个包含根目录。
如果我要实现非层次结构的文件系统,我将始终返回null作为空根,因为在我看来,在非层次结构的文件系统中根本就不存在定义明确的概念。既然我这样想,其他开发者也可能这样想。因此,您不能假设每个绝对路径都有一个根。
请注意,分布式文件系统在许多领域都很常见,因此这不仅仅是一个永远不会实现的边角案例。我认为你必须预见到这一点。
结论
- 接口并不要求每个绝对路径必须有根
- 有合理的文件系统没有根是有意义的
- 评论中提到的Oracle教程不是接口的合同。您不应该依赖它
因此,将有人实现没有根的文件系统;你应该预见到这一点。
FileSystem
是一个public abstract class
。你可能想要扩展它(以及它返回的Path
实例)来实现某些功能。 - Sotirios DelimanolisFileSystem
辅助库并探索 API 的方方面面 ;) - fge