将nio.path与Paths.get()或Path.resolve()连接

时间:2019-02-22 21:16:15

标签: java path nio

我想知道在本例中使用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的引用。”

1 个答案:

答案 0 :(得分: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