34

javadoc.isAbsolute()说:

判断这条路径是否是绝对的。
绝对路径是完整的,因为它不需要与其他路径信息结合来定位文件。

返回: true当且仅当此路径是绝对路径

javadoc.getRoot()说:

将此路径的根组件作为 Path 对象返回,如果此路径没有根组件,则返回 null。

返回: 表示此路径的根组件的路径,或null

好的,所以,我在这里不知所措;是否有任何文件系统的路径可能是绝对的,根本没有根?


编辑:请注意,可能存在具有根但不是绝对的路径。例如,这些在 Windows 系统上:

  • C:foo;
  • \foo\bar.

但我在这里要求相反:没有根和绝对。

4

3 回答 3

16

好吧,文件系统有一些晦涩难懂的东西。我制作了一些企业搜索爬虫,在路上的某个地方,你会注意到一些奇怪的文件系统事情发生在路径上。顺便说一句:这些都是自定义(覆盖)文件系统的实现,所以没有标准的,你可以肯定地争论几个小时这些东西是好主意,什么不是......不过,我不认为你'使用标准文件系统会遇到任何这些情况。

这里有几个奇怪的例子:

容器文件系统(OLE2、ZIP、TAR 等)中的文件:c:\foo\bar\blah.zip\myfile

在这种情况下,您可以决定哪个项目是“根”:

  • 'C:\' ?那不是包含该文件的 zip 文件的根...
  • 'c:\foo\bar\blah.zip' ? 它可能是文件的根目录,但这样做可能会破坏您的应用程序。
  • 'blah.zip' ? 可能是 zip 文件的根目录 - 但无论如何这也可能会破坏您的应用程序。
  • '/' ? 就像在 zip 文件中的“/”文件夹中一样?这可能是可能的,但从长远来看,这会让你非常头疼。

'graph' 类似于 HTTP 之类的结构:

  • 您拥有“/foo/bar”这一事实并不意味着存在“/foo”甚至“/”。(假设符合您的标准)。你唯一能做的就是走图表...
  • 请注意,像 WebDav 之类的协议是基于 HTTP 的,可能会让您感到头疼。我在这里有一些自定义 webdav 文件系统的示例,这些文件系统没有“根”文件夹,但有绝对路径。

尽管如此,您仍然可以争辩说,您可以到达的最常见的路径(如果存在......)是根或存在根 - 但您根本无法到达它(即使它真的不存在)。

桑巴/netbios

如果您将完整的 Samba(Windows 网络)网络视为单个文件系统,那么您基本上会得到一个包含所有工作组的“根”、一个包含所有计算机的工作组、一台包含所有共享的计算机,然后是共享中的文件.

但是......根和工作组并不真正存在。它们是由广播协议组成的(如果您有超过 1000 台计算机的网络,这也是非常不可靠的)。从爬虫的角度来看,将“根”和“工作组”目录与(可靠的)其余目录完全不同是很有意义的。

然而

这些场景只描述了根不可达、不可靠或其他情况的路径。从理论上讲,我想在你能想到的任何 URL 中,总会有一个根。毕竟,它是由定义层次结构的字符串组成的,因此根据定义,它有一个开始。

于 2014-12-15T15:47:00.130 回答
14

语义问题

从我对这个主题的理解来看,一条绝对路径只有在它可以追溯到它的根源时才能是绝对的。因此,永远不应该有没有根的绝对路径。最终,这只是归结为语义,尽管我们可以找到定义绝对路径的定义(例如下面);

在这一点之后剩下的唯一真正的问题是 Java API 的定义是否遵循。我可以从官方 Oracle 源代码中找到对绝对路径定义(参考根元素)的唯一引用来自官方 Java 教程。Java官方教程说

绝对路径总是包含根元素

如果要相信这个陈述,那么任何文件系统(无论多么晦涩)都不能包含 Java API 认为绝对的 Path ,除非它也认为它包含 root

您可能会争辩说,在某些非分层文件系统中,您可能会遇到一些问题,以确定文件是否可以是它自己的根。但是,根据Path API (强调我的)中的这个定义,路径不应该代表非分层元素;

Path 表示一个层次结构的路径,由一系列目录和文件名元素组成

于 2014-12-15T15:50:45.677 回答
12

定义

该接口说明了有关根的以下内容:

也可能存在标识文件系统层次结构的根组件。

如您所见,该注释似乎暗示根用于文件系统层次结构。现在我们必须推理什么是绝对路径。该界面告诉我们以下内容:

绝对路径是完整的,因为它不需要与其他路径信息结合来定位文件。

因此,如您所见,关于绝对路径的定义中没有关于根的词。唯一的限制是我们必须能够在没有更多信息的情况下找到文件。

分层文件系统

大多数文件系统是分层的,即它们是树(如果我们考虑链接,则为图)或森林。树中的根是不是另一个节点(不包括链接)的子节点的节点。例如,Windows 文件系统是林,因为它们有许多根 ( C:, D:,...)。Linux 通常只有一个根,即/. 根非常重要,因为没有它们就很难开始查找文件。在这样的文件系统中,您通常可以依赖每个具有根的绝对路径。

非分层文件系统

只要我们有一个分层文件系统,我们就可以预测绝对路径中的根,但是如果我们没有根怎么办?然后,绝对路径可能不包含根。

我想到的一个例子:像Chord这样的分布式文件系统。这些通常不是分层的,因此根的含义通常是未定义的。相反,文件哈希标识文件(Chord 中的 SHA-1)。因此,有效的 Chord 路径可能如下所示:

cf23df2207d99a74fbe169e3eba035e633b65d94

这是一条绝对路径。无需进一步信息即可检索相关文件,因此路径是绝对的。但是,我看不到根。我们可以将整个哈希定义为它自己的根(然后每个文件都将是它自己的根),但是没有人能保证每个实现 Chord 文件系统的人都会同意这一点。因此,可能存在不将这些哈希视为根的合理实现。在这样的文件系统中,每个路径都是绝对路径,但没有一个路径包含根。

如果我要实现非分层文件系统,我将始终null以 root 身份返回,因为恕我直言,root 在非分层文件系统中不是定义的概念。既然我是这样想的,其他开发者可能也会这么想。因此,您可能不会假设每个绝对路径都有一个根。

请注意,分布式文件系统在许多领域都很常见,因此这不仅仅是一个永远不会实现的极端情况。我认为你必须预料到它。

结论

  1. 该接口不要求每个绝对路径必须有一个根
  2. 有合理的文件系统,其中没有根是有意义的
  3. 评论中提到的 Oracle 教程不是该接口的合同。你不应该依赖这个

所以会有人实现没有根的文件系统;你应该预料到这一点。

于 2014-12-15T15:56:56.873 回答