在Linux上,Path.startsWith对于Windows文件路径返回false。

5
为什么会这样呢?
Path parent1 = Paths.get("/flugel/borf/noggin");
Path child1 = Paths.get("/flugel/borf/noggin/foo/bar/baz.jpg");
System.out.println("child1 startsWith parent1? " + child1.startsWith(parent1));
System.out.println(child1.getFileSystem());
System.out.println(parent1.getFileSystem());

Path parent2 = Paths.get("C:\\foo");
Path child2 = Paths.get("C:\\foo\\bar\\baz.jpg");
System.out.println("child2 startsWith parent2? " + child2.startsWith(parent2));
System.out.println(child2.getFileSystem());
System.out.println(parent2.getFileSystem());

返回值

child1 startsWith parent1? true
sun.nio.fs.LinuxFileSystem@f5f2bb7
sun.nio.fs.LinuxFileSystem@f5f2bb7
child2 startsWith parent2? false
sun.nio.fs.LinuxFileSystem@f5f2bb7
sun.nio.fs.LinuxFileSystem@f5f2bb7

我在Ubuntu上运行Java 8,但是关于Path.startsWith的javadocs并没有解释为什么会出现这种情况。两个文件路径都不包含任何实际的文件。
3个回答

2
您需要检查代码才能了解实际情况。因此,当您创建路径时,将调用 normalizeAndCheck 函数。在您的情况下,这是在 sun.nio.fs.UnixPath 上调用的。由于*nix的路径分隔符是/,因此路径字符串将通过/进行规范化。

对于Windows路径,没有/,因此它们将保持完全相同,因此会比较 "C:\\foo""C:\\foo\\bar\\baz.jpg" ,它们是不同的字符串,因此没有共同的前缀。


我意识到这种事情正在发生,但它仍然感觉令人惊讶。 - ben3000
感谢提供相关源代码的链接,我之前一直在错误的部分调试,没有注意到这个。回答很好。 - ben3000
太好了!为这个答案点赞 :-) - user987339

1

我认为java.nio.file.Path的Java文档中以下内容可以回答你的问题:

一个可用于在文件系统中定位文件的对象。它通常表示系统相关的文件路径


嗯,我可能只是匆匆浏览了那一部分,我关注的是下面这句话:“如果给定的路径与此路径关联的文件系统不同,则返回false。” 我认为这意味着我的代码会正常工作。 - ben3000

0

如Javadocs所述,Java使用“路径分隔符”来确定当前操作环境的路径分隔符字符。可以通过以下方式访问:

System.getProperty("path.separator");

在基于 UNIX 的系统上,路径分隔符是"/",而在 Windows 系统中则为 "\"。如果您想更改这些属性,可以使用以下方法实现:

Properties p = System.getProperties();
p.put("path.separator", "\\");
System.setProperties(p);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接