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

问题描述 投票:1回答:1

我想知道在这个例子中使用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
}

看起来两者的行为都相同,但在Java EE应用程序中,我目睹了p1将主目录指定为前缀。我找到了@Aleksandr Dubinsky对这个StackOverflow问题How to combine paths in Java?的回答,但我不明白引用的javadoc的含义:

请注意,Paths.get()(由其他人建议)没有使用Path的重载,而执行Paths.get(path.toString(),childPath)与resolve()不同。来自Paths.get()文档:

请注意,虽然此方法非常方便,但使用它将意味着对默认FileSystem的假定引用并限制调用代码的实用程序。因此,它不应该在用于灵活重用的库代码中使用。更灵活的替代方法是使用现有的Path实例作为锚点,例如:

Path dir = ...
Path path = dir.resolve("file");

具体来说,我不明白javadoc想要说什么“将暗示对默认FileSystem的假定引用。”

java path nio
1个回答
1
投票

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 
© www.soinside.com 2019 - 2024. All rights reserved.