为什么会这样?
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.UnixPath
上sun.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);