小编典典

如何从两个绝对路径(或 URL)构造 Java 中的相对路径?

all

给定两条绝对路径,例如

/var/data/stuff/xyz.dat
/var/data

如何创建以第二条路径为基础的相对路径?在上面的示例中,结果应该是:./stuff/xyz.dat


阅读 78

收藏
2022-04-18

共1个答案

小编典典

有点迂回,但为什么不使用URI呢?它有一个 relativize 方法,可以为你做所有必要的检查。

String path = "/var/data/stuff/xyz.dat";
String base = "/var/data";
String relative = new File(base).toURI().relativize(new File(path).toURI()).getPath();
// relative == "stuff/xyz.dat"

请注意,正如另一个答案java.nio.file.Path#relativize中指出的那样,自Java 1.7 以来的文件路径。

这是其他图书馆免费的解决方案:

Path sourceFile = Paths.get("some/common/path/example/a/b/c/f1.txt");
Path targetFile = Paths.get("some/common/path/example/d/e/f2.txt"); 
Path relativePath = sourceFile.relativize(targetFile);
System.out.println(relativePath);

输出

..\..\..\..\d\e\f2.txt

[编辑] 实际上它输出更多 ..\ 因为源是文件而不是目录。我的情况的正确解决方案是:

Path sourceFile = Paths.get(new File("some/common/path/example/a/b/c/f1.txt").parent());
Path targetFile = Paths.get("some/common/path/example/d/e/f2.txt"); 
Path relativePath = sourceFile.relativize(targetFile);
System.out.println(relativePath);
2022-04-18