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

2022-08-31 05:05:37

给定两条绝对路径,例如

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

如何创建一个使用第二个路径作为其基础的相对路径?在上面的示例中,结果应为:./stuff/xyz.dat


答案 1

这是一个小小的迂回,但为什么不使用URI呢?它有一个相对化方法,可以为您完成所有必要的检查。

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 1.7以来一直存在,正如@Jirka Meluzin在另一个答案中指出的那样。java.nio.file.Path#relativize


答案 2

从Java 7开始,您可以使用相对化方法:

import java.nio.file.Path;
import java.nio.file.Paths;

public class Test {

     public static void main(String[] args) {
        Path pathAbsolute = Paths.get("/var/data/stuff/xyz.dat");
        Path pathBase = Paths.get("/var/data");
        Path pathRelative = pathBase.relativize(pathAbsolute);
        System.out.println(pathRelative);
    }

}

输出:

stuff/xyz.dat