【问题标题】:Path.startsWith returns false for a Windows file path on Linux对于 Linux 上的 Windows 文件路径,Path.startsWith 返回 false
【发布时间】:2016-08-01 08:29:40
【问题描述】:

为什么会这样?

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

【问题讨论】:

    标签: java linux nio


    【解决方案1】:

    您必须检查代码以了解实际情况。因此,当您创建路径时会调用 normalizeAndCheck 函数。在您的情况下,这是在 sun.nio.fs.UnixPath 上调用的。由于 *nix 的路径分隔符是 /,路径字符串将由 / 规范化。

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

    【讨论】:

    • 我认为这种事情正在发生,但不知何故仍然让人感到惊讶。
    • 感谢相关源代码的链接,我试图通过错误的部分,因此没有注意到这一点。很好的答案。
    • 太棒了!投票给答案:-)
    【解决方案2】:

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

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

    【讨论】:

    • 嗯,我必须略读那一点,我专注于以下句子:“如果给定路径与该路径的不同文件系统相关联,则返回 false。”我觉得这意味着我的代码可以正常工作。
    【解决方案3】:

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

    System.getProperty("path.separator");
    

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

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

    【讨论】:

      猜你喜欢
      • 2016-05-15
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      • 1970-01-01
      • 2021-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多