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