无法在两个文件之间获得正确的相对路径,只有当一个路径是文件而另一个路径是目录时,这是正常的预期行为吗?

时间:2014-05-05 15:34:55

标签: java java-7 nio


编辑:

我正在以不同的方式看待这个../并且精神上附加了一个带有目录斜杠的目录路径的想法(所以目录名+ / + ../),它会指向一个目录太远回来了,但现在我看到目录名+ ../在这种情况下实际上是正确的。


我无法在两个文件之间获得正确的相对路径,只有当一个路径是文件而另一个路径是目录时,这是Path.relativize(Path)的正常预期行为吗? JavaDocs提到它适用于Path对象,但没有比这更具体。

这是我的示例代码(在Windows上运行),其中包含对我预期的输出的评论:

import java.nio.file.Path;
import java.nio.file.Paths;
public class PathsTest
{
    public static void main(String[] args)
    {
        Path pathA = Paths.get("C:\\a\\b\\1.txt");
        System.out.println(pathA);
        Path pathB = Paths.get("C:\\a\\b\\2.txt");
        System.out.println(pathB);
        Path relativePathBetween = pathA.relativize(pathB);
        System.out.println("rel: " + relativePathBetween);
        // Outputs "..\2.txt" (for the last print here)
        // Expected: "2.txt"

        pathA = Paths.get("C:\\a\\b\\1.txt");
        pathA = pathA.getParent(); // Obtaining parent here, so C:\a\b
        System.out.println(pathA);
        pathB = Paths.get("C:\\a\\b\\2.txt");
        System.out.println(pathB);
        relativePathBetween = pathA.relativize(pathB);
        System.out.println("rel: " + relativePathBetween);
        // Outputs: "2.txt"
        // Expected: "2.txt"

        // So why does pathA have to be a directory and not a file?
        // Javadocs don't seem to mention that.
    }
}

以下是该计划的全部输出:

C:\a\b\1.txt
C:\a\b\2.txt
rel: ..\2.txt
C:\a\b
C:\a\b\2.txt
rel: 2.txt

1 个答案:

答案 0 :(得分:1)

../表示父级,因此在您的第一个示例中,它对应于"C:\\a\\b\\,您获得的结果看起来很好。

为什么你期望“2.txt”,你会得到Path pathB = Paths.get("C:\\a\\b\\1.txt\\2.txt");