【发布时间】:2016-10-11 09:37:57
【问题描述】:
我试图让自己熟悉 java.nio.file.Path.relativize() 无济于事。
我已经阅读了 javadocs,也看到了一些例子。但是,我仍然无法理解以下示例(我使用 Linux,向 windows 用户道歉):
程序的工作目录是:/home/userspace/workspace/java8。
有两个文件:/home/userspace/workspace/java8/zoo.txt 和 /home/userspace/temp/delete/dictionary.txt
以下程序调用Path.relativize():
package certExam.java8.ch9NIO.paths;
import java.nio.file.Path;
import java.nio.file.Paths;
public class Relativize
{
public static void main(String[] args)
{
Path relativePathToZoo = Paths.get("zoo.txt");
Path relativePathToDictionary = Paths.get("../../temp/delete/dictionary.txt");
System.out.println("relativePathToZoo.relativize(relativePathToDictionary): "+relativePathToZoo.relativize(relativePathToDictionary));
System.out.println("relativePathToZoo.relativize(relativePathToDictionary).toAbsolutePath(): "+relativePathToZoo.relativize(relativePathToDictionary).toAbsolutePath());
System.out.println("relativePathToZoo.relativize(relativePathToDictionary).toAbsolutePath().normalize(): "+relativePathToZoo.relativize(relativePathToDictionary).toAbsolutePath().normalize());
System.out.println("relativePathToDictionary.relativize(relativePathToZoo): "+relativePathToDictionary.relativize(relativePathToZoo));
System.out.println("relativePathToDictionary.relativize(relativePathToZoo).toAbsolutePath().normalize(): "+relativePathToDictionary.relativize(relativePathToZoo).toAbsolutePath().normalize());
System.out.println();
}
}
输出是:
relativePathToZoo.relativize(relativePathToDictionary): ../../../temp/delete/dictionary.txt
relativePathToZoo.relativize(relativePathToDictionary).toAbsolutePath(): /home/userspace/workspace/java8/../../../temp/delete/dictionary.txt
relativePathToZoo.relativize(relativePathToDictionary).toAbsolutePath().normalize(): /home/temp/delete/dictionary.txt
relativePathToDictionary.relativize(relativePathToZoo): ../../../../../zoo.txt
relativePathToDictionary.relativize(relativePathToZoo).toAbsolutePath().normalize(): /zoo.txt
我的问题,我无法理解的是:为什么 relativePathToDictionary.relativize(relativePathToZoo) 输出 ../../../../../zoo.txt?
当归一化时,它会让你认为 zoo.txt 存在于根目录中。
relativize() 是如何得出这么深的路径的?我知道 relativize() 与当前工作目录相关,因此它会将 .. 添加到每个路径。但我无法理解,它是如何计算出与 dictionary.txt 相关的 zoo.txt 路径。
【问题讨论】:
-
记住relativize返回的东西可以传递给resolve,resolve assumes its Path represents a directory.因此,relativize也假设它的Path是一个目录。
-
经过一段时间的思考,我明白了这一点:我正在终端上的目录上导航,我想用一个 cd 命令从路径 A 转到路径 B。这就是 relativize 的输出