本文介绍了对于Linux上的Windows文件路径,Path.startsWith返回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的javadocs的任何内容都没有解释为什么会发生这种情况.这两个文件路径均不包含任何实际文件.

I'm running Java 8 on Ubuntu, but nothing about the javadocs for Path.startsWith explains why this occurs. Neither file path contains any actual files.

推荐答案

您必须检查代码以查看实际情况.因此,当您创建路径 normalizeAndCheck 函数被调用.在您的情况下,在sun.nio.fs.UnixPath上调用它.由于* nix的路径定界符为/,因此路径字符串将由/规范化.

You have to check the code to see what is actually going on. So when you create a Path normalizeAndCheck function is called. In your case this is called on sun.nio.fs.UnixPath. Since path delimiter for *nix is / path strings will be normalized by /.

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

In case of Windows paths there are no / so they will stay exactly the same, so it will compare "C:\\foo" "C:\\foo\\bar\\baz.jpg" which are different strings and hence no common prefix.

这篇关于对于Linux上的Windows文件路径,Path.startsWith返回false的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-29 05:38