Path.equals 在 Windows 和 Linux 上的表现不同

Path.equals behaves different on Windows and Linux

我使用下面的代码比较Java中的两个路径:

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 的路径分隔符不同。

因为 Windows 是 \

因为 Linux 是 /

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

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

在您的例子中,您使用字符串来形成路径。所以在 Windows

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

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

转换后路径 1 和路径 2 相同

现在当你运行在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 和类 Unix 系统上的路径分隔符,如 Linux。 现代 Windows 操作系统可以使用 \/ 作为路径分隔符。

如果您为 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