使用 Paths.get() 或 Path.resolve() 连接 nio.path

Fab*_*n K 7 java nio path

我想知道使用 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 实例作为锚点,例如:

Path dir = ...
Path path = dir.resolve("file");
Run Code Online (Sandbox Code Playgroud)

具体来说,我不明白 javadoc 想要说的“将暗示对默认文件系统的假定引用”。

scr*_*ari 3

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)