可以有一个(Java 7)文件系统,其路径.isAbsolute()但具有空根?

fge*_*fge 33 java java-7 java.nio.file

javadoc .isAbsolute()说:

判断此路径是否绝对.
绝对路径是完整的,因为它不需要与其他路径信息组合以便定位文件.

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

javadoc .getRoot()说:

以Path对象的形式返回此路径的根组件,如果此路径没有根组件,则返回null.

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

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


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

  • C:foo;
  • \foo\bar.

但我在这里要求反过来:没有根和绝对.

atl*_*ste 15

嗯,文件系统有一些模糊的东西.我做了一些企业搜索爬虫,在某个地方,你会发现一些奇怪的文件系统事情正在进行路径.顺便说一句:这些都是自定义(覆盖)文件系统的所有实现,所以没有标准的文件系统,你绝对可以争论几个小时,这些东西是好主意和什么不是......但是,我不认为你'将使用标准文件系统遇到任何这些情况.

这里有一些奇怪的事情:

容器文件系统中的文件(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文件系统的例子,它们没有'root'文件夹,但确实有绝对路径.

不过,你可以争辩说,你可以达到的最常见的路径(如果存在......)是根或者有根 - 但你根本无法达到它(即使它确实不存在).

桑巴/的NetBIOS

如果你看到一个完整的Samba(Windows网络)网络作为一个单一的文件系统,那么你基本上包含所有工作组的"根"最终,包含所有计算机工作组,包含了所有的股票,并在份额则文件的计算机.

但是......根和工作组实际上并不存在.它们是由广播协议组成的东西(如果您拥有超过1000台计算机的网络,这也是非常不可靠的).从爬虫的角度来看,世界上有必要将"根"和"工作组"目录与(可靠的)休息完全不同.

然而

这些方案仅描述了根不可达,不可靠或其他方式的路径.从理论上讲,我认为在任何你能想到的URL中,总有一个根.毕竟,它构成了一个定义层次结构的字符串,因此根据定义它有一个开始.


Rud*_*haw 13

语义问题

根据我对这个主题的理解,绝对路径只有在可以追溯到它的根时才是绝对的.因此,永远不应该有没有根的绝对路径.最终,这只是归结为语义,虽然我们可以找到定义绝对路径的定义(例如下面的);

在这一点之后留下的唯一真正问题是Java API的定义是否适用.我可以在官方Java教程中找到来自官方Oracle源的绝对路径(参考根元素)定义的唯一地方.官方Java教程说

绝对路径始终包含根元素

如果要相信这个语句,那么任何文件系统(无论多么模糊)都不能包含Java API将认为是绝对的路径,除非它还认为它包含一个根.

您可能会争辩说,在某些非历史文件系统中,您可能会遇到一些问题,这些问题决定了文件是否可以作为自己的根目录.但是,通过Path API中的这个定义(强调我的),路径不应该代表非分层元素;

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


gex*_*ide 12

定义

接口说明了以下关于根:

还可以存在标识文件系统层次结构的根组件.

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

绝对路径是完整的,因为它不需要与其他路径信息组合以便定位文件.

所以,正如你所看到的,关于绝对路径的定义中根本没有关于根的说法.唯一的限制是我们必须能够在没有进一步信息的情况下找到文件.

分层文件系统

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

非分层文件系统

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

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

cf23df2207d99a74fbe169e3eba035e633b65d94
Run Code Online (Sandbox Code Playgroud)

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

如果我要实现一个非分层文件系统,我总是null以root身份返回,因为IMHO根目录不是非分层文件系统中定义的概念.因为我认为这样,其他开发者也可能这么认为.因此,您可能不会假设每个绝对路径都有根.

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

结论

  1. 接口并未强制要求每个绝对路径都必须具有根
  2. 有合理的文件系统,没有root是有道理的
  3. 注释中提到的Oracle教程不是接口的合同.你不应该依赖于此

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