Path.startsWith在Linux上为Windows文件path返回false

为什么会这样?

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的javadoc解释为什么发生这种情况。 两个文件path都不包含任何实际的文件。

你必须检查代码,看看实际发生了什么。 所以当你创建一个路径normalizeAndCheck函数被调用。 在你的情况下,这是在sun.nio.fs.UnixPathsun.nio.fs.UnixPath 。 由于* nix的路径分隔符是/路径字符串将被标准化为/

在Windows路径的情况下,没有/因此它们将保持完全相同,所以它将比较"C:\\foo" "C:\\foo\\bar\\baz.jpg"这是不同的字符串,因此不会通用前缀。

我认为从java.nio.file.Path的 Java Docs下面回答你的问题

可用于在文件系统中查找文件的对象。 它通常代表一个依赖系统的文件路径

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

 System.getProperty("path.separator"); 

在基于UNIX的系统上是“/”,而在Windows系统上是“\”。 如果你想改变这些属性,你可以使用以下来实现:

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