我想知道使用 Paths.get() 和 Path.resolve 之间有什么区别,如下例所示:
public static void main(String[] args) {
Path p1 = Paths.get("dir1","dir2","file.jpg");
Path p2 = Paths.get("").resolve("dir1/dir2/file.jpg");
System.out.println(p1.toString()); // yields: dir1/dir2/file.jpg
System.out.println(p2.toString()); // yields: dir1/dir2/file.jpg
}
Run Code Online (Sandbox Code Playgroud)
看起来两者的行为相同,但在 Java EE 应用程序中,我目睹了p1将主目录分配为前缀。我找到了 @Aleksandr Dubinsky 对 StackOverflow 问题How to join paths in Java?的回答。,但我不明白引用的javadoc的含义:
请注意,Paths.get() (如其他人建议的那样)没有采用 Path 的重载,并且执行 Paths.get(path.toString(), childPath) 与resolve () 不同。来自 Paths.get() 文档:
请注意,虽然此方法非常方便,但使用它意味着假定引用默认文件系统并限制调用代码的实用性。因此,它不应该在旨在灵活重用的库代码中使用。更灵活的替代方案是使用现有的 Path 实例作为锚点,例如:
Run Code Online (Sandbox Code Playgroud)Path dir = ... Path path = dir.resolve("file");
具体来说,我不明白 javadoc 想要说的“将暗示对默认文件系统的假定引用”。
Paths.get(...)在某种程度上,它的工作方式类似于 Python 的os.path.join(...)函数,只需使用适当的文件分隔符连接路径的各个部分。该resolve方法有一些关于参数的内部逻辑和假设。使用实际文件系统意味着该方法将检查参数是否是绝对路径。resolve一般情况下,该方法将使用某些特定的文件系统,同时get将由“默认文件系统”支持。
比较:
jshell> Paths.get("one", "/two")
$6 ==> one/two
jshell> Paths.get("one").resolve("/two")
$7 ==> /two
Run Code Online (Sandbox Code Playgroud)