java.nio中绝对路径的分辨率

时间:2015-04-08 14:41:20

标签: java java.nio.file

Path.resolve(Path other)上的文档声称

  

如果other参数是绝对路径,则此方法通常会返回other

我很困惑:为什么?是否有一个真实的用例,证明这个功能是少数?

我有一个反例。假设我们要将文件从一个FileSystem复制到另一个,并且我们还要保留其路径字符串。例如,如果原始文件位于fs1 /foo/bar/readme.txt ,则副本应为 /foo/bar/readme.txt at fs2。一个显而易见的灵魂是:

public void copyFile(Path fs1path, FileSystem fs2) {
    Path fs2path = fs2.getRootDirectories().next();
    Path src  = fs1path.getAbsolute();
    Path dest = fs2path.resolve(src);
    Files.copy(src, dest);
}

当然,它不起作用,因为destfs1而不是fs2相关联。但上面的代码看起来如此一致!也许,我对Path及其解决方案缺乏了解?请帮助我渡过难关。

2 个答案:

答案 0 :(得分:0)

resolve方法“只是”用于join两条路径。因此,如果传递部分路径(带有root),则该部分路径将附加到“this”路径。如果传递绝对路径,则返回传入的路径。在您的情况下,复制失败,因为目标文件系统上可能不存在fs1path(fs2); resolve方法不会检查路径是否存在。

答案 1 :(得分:0)

Path总是指某些FileSystem。要使用Path作为参数,引用与用于调用方法的FileSystem不同的Path,并不像一个典型的用例。因此,如果传递绝对Path,则该方法无法将其附加到被调用的Path,只返回参数。

我认为期待Path中描述的功能引用不同的FileSystem会很奇怪。我希望Path能够规范化自身,FileSystem实现能够将路径的表示转换为Path,对FileSystem有效}}

我还没有发现这是用Java实现的,但是这段代码可能就是你想要的:

    final Path fs1path = fs1.getPath(fs2path.normalize().toString()
            .replace(fs2.getSeparator(), fs1.getSeparator()));