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

ben*_*000 5 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.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());
Run Code Online (Sandbox Code Playgroud)

返回

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
Run Code Online (Sandbox Code Playgroud)

我在 Ubuntu 上运行 Java 8,但是关于 javadoc 的任何内容都没有Path.startsWith解释为什么会发生这种情况。两个文件路径都不包含任何实际文件。

use*_*339 2

您必须检查代码才能了解实际发生的情况。所以当你创建Path时,normalizeAndCheck函数就会被调用。在你的情况下,这被称为sun.nio.fs.UnixPath. 由于 *nix 的路径分隔符是/ 路径字符串,因此将通过/.

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