是否存在一个(Java 7)文件系统,其路径为.isAbsolute()但具有空根目录?

2022-09-01 07:44:38

.isAbsolute() 的 javadoc 说:

告诉此路径是否为绝对路径。
绝对路径是完整的,因为它不需要与其他路径信息组合即可找到文件。

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

.getRoot() 的 javadoc 说:

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

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

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


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

  • C:foo;
  • \foo\bar.

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


答案 1

好吧,文件系统有一些晦涩难懂的东西。我做了一些企业搜索爬虫,在路上的某个地方,你会注意到一些奇怪的文件系统问题。顺便说一句:这些都是自定义(被覆盖的)文件系统的实现,所以没有标准的,你绝对可以争论几个小时,这些东西中哪些是好主意,哪些不是......不过,我不认为您在标准文件系统中会遇到任何这些情况。

以下是一些奇怪的事情的例子:

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

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

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

像HTTP这样的结构的“图形”:

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

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

桑巴/内比奥斯

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

然而。。。根和工作组实际上并不存在。它们是由广播协议组成的(如果你有一个超过1000台计算机的网络,这也是非常不可靠的)。从爬虫的角度来看,将“根”和“工作组”目录与(可靠的)其余目录完全不同地对待是有意义的。

然而

这些方案仅描述根无法访问、不可靠或其他内容的路径。从理论上讲,我认为在你能想到的任何URL中,总有一个根。毕竟,它被组成为定义层次结构的字符串,因此根据定义,层次结构具有开始。


答案 2

语义学问题

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

在这一点之后,唯一真正的问题是Java API的定义是否效仿。我唯一能找到从官方Oracle源中引用绝对路径(参考根元素)定义的地方是从官方Java教程内部。官方Java教程说

绝对路径始终包含根元素

如果要相信此语句,那么任何文件系统(无论多么晦涩难懂)都不能包含 Java API 认为绝对的 Path,除非它也认为它包含根

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

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


推荐