给定两条绝对路径,例如
/var/data/stuff/xyz.dat /var/data
如何创建以第二条路径为基础的相对路径?在上面的示例中,结果应该是:./stuff/xyz.dat
./stuff/xyz.dat
有点迂回,但为什么不使用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 以来的文件路径。
java.nio.file.Path#relativize
这是其他图书馆免费的解决方案:
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);