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

Java 对于Linux上的Windows文件路径,Path.startsWith返回false,java,linux,nio,Java,Linux,Nio,为什么会这样 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

为什么会这样

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上运行Java8,但是关于
Path.startsWith
的javadocs没有解释为什么会发生这种情况。这两个文件路径都不包含任何实际文件。

我认为下面的Java文档行回答了您的问题

可用于在文件系统中定位文件的对象。会的 通常表示依赖于系统的文件路径


你必须检查代码,看看到底发生了什么。因此,当您创建一个路径函数时,它被调用。在您的例子中,这是在
sun.nio.fs.UnixPath
上调用的。由于*nix的路径分隔符是
/
路径字符串将由
/
规范化


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

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

System.getProperty("path.separator");
在基于UNIX的系统上,它是“/”,而在Windows系统上,它是“\”。如果要更改这些属性,可以使用以下方法来实现:

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

嗯,我一定是略读了这一点,我把重点放在了下面这句话上:“如果给定的路径与此路径的不同文件系统相关联,则返回false。”我觉得这意味着我的代码可以正常工作。我认为这类事情正在发生,但不知怎的,它仍然让人感到惊讶。感谢相关源代码的链接,我试图通过错误的部分,因此没有注意到这一点。回答得好,太好了!对答案投赞成票:-)