【问题标题】:Path.equals behaves different on Windows and LinuxPath.equals 在 Windows 和 Linux 上的行为不同
【发布时间】:2021-04-26 23:14:20
【问题描述】:

我使用下面的代码来比较 Java 中的两个 Path:

import java.nio.file.Paths;

public class PathTest {
   public static void main(String args[]) {
      String path1 = "path1\\file1.jpg";
      String path2 = "path1/file1.jpg";
      System.out.println(Paths.get(path1));
      System.out.println(Paths.get(path2));
      System.out.println(Paths.get(path1).equals(Paths.get(path2)));
   }
}

我确实在我的 Windows 机器上得到以下输出:

path1\file1.jpg
path1\file1.jpg
true

在 linux 上:

path1\file1.jpg
path1/file1.jpg
false

这是怎么回事?

【问题讨论】:

  • “两个路径是否相等取决于文件系统实现”。 Windows在这里比Linux更宽容。 docs.microsoft.com/en-us/dotnet/standard/io/file-path-formats "所有正斜杠 (/) 都转换为标准的 Windows 分隔符,反斜杠 ()。"
  • 是的,你是对的。字符串的印刷也很愚蠢。我想打印路径对象,我将调整示例。在 Windows 上,斜线会发生转换。谢谢!

标签: java path operating-system equals environment


【解决方案1】:

/ 是 Unix 和类 Unix 系统(如 Linux)上的路径分隔符。 现代 Windows 操作系统可以同时使用 \/ 作为路径分隔符。

【讨论】:

    【解决方案2】:

    Windows 和 Linux 的路径分隔符不同。

    对于 Windows 是 \

    对于 Linux 是 /

    在 java 中构建适用于两种环境的路径的安全方法是

    Path filePath = Paths.get("path1", "path2");
    

    在您的情况下,您使用字符串来形成路径。所以在 Windows 中

     String path2 = "path1/file1.jpg";
     Paths.get(path2)  -> results in "path1\file1.jpg"
    

    它将分隔符 / 转换为 windows 分隔符 \

    在转换之后,path1 和 path2 都相同

    现在当你在 Linux 中运行以下代码

          String path1 = "path1\\file1.jpg"; -> this will not be ok for linux and also will not try to convert it to / as the first \ is an escape character
          String path2 = "path1/file1.jpg";  -> this will be ok for linux /
          System.out.println(Paths.get(path1));
          System.out.println(Paths.get(path2));
          System.out.println(Paths.get(path1).equals(Paths.get(path2)));
    

    【讨论】:

    • 最后,我的目标是将来自 unix 或 windows 系统的路径字符串与我无法控制的导入数据进行比较。因此,使用 Paths.get("", "") 构建路径不是一种选择。这里最好的选择是什么,在比较字符串之前替换字符串中的所有斜杠?
    • 好的,我查看了stackoverflow.com/questions/1697303/… 非常感谢您帮助我!
    【解决方案3】:

    如果您为 Windows 和 Linux 开发,您通常可以使用 / 作为路径分隔符,而不必费心使用 File.separator。例如,Windows 上的 Java 可以正确解析所有这些路径名,而无需字符串中的 "\\",甚至是 UNC 格式:

    var unc =  Path.of("//storage/media/camera")
    ==> \\storage\media\camera
    var mdrive = Path.of("M:/camera")
    ==> M:\camera
    var build = Path.of("build/classes");
    ==> build\classes
    var a= Path.of("/Temp")
    ==> \Temp
    

    【讨论】:

      猜你喜欢
      • 2019-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-11
      • 2013-12-24
      • 1970-01-01
      • 2012-11-11
      相关资源
      最近更新 更多