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
我使用下面的代码比较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