首页 > 解决方案 > 如何在 Java 中创建相对路径?

问题描述

我有根目录和嵌套在根目录中的文件(它们可以在子目录中)。我想创建这些文件的相对路径列表。我写了代码,但替换不起作用。

public class FileManager {
private Path rootPath;
private List<Path> fileList = new ArrayList<Path>();

public FileManager(Path rootPath) throws IOException{
    this.rootPath = rootPath;
    collectFileList(rootPath);
}

private void collectFileList(Path path) throws IOException{
    if (Files.isRegularFile(path)){
        if (!fileList.contains(path.getParent())){
                String result_path =  path.toAbsolutePath().toString().replaceAll(rootPath.toString(),"");
                fileList.add(Paths.get(result_path));
        }
    }else if (Files.isDirectory(path)){
        for (File file:path.toFile().listFiles()
             ) {
            collectFileList(Paths.get(file.getAbsolutePath()));
        }

}
}

例如:我有根目录“E:\test”,我有文件“E:\test\test2\1.txt”。我想替换路径文件的根目录,并返回“test2\1.txt”。但我总是收到“E:\test\test2\1.txt”。我的替换有什么问题?

标签: java

解决方案


相对化!

Path relativize(Path other)

相对化是分辨率的倒数。此方法尝试构造一个相对路径,当针对此路径解析时,会生成一个与给定路径定位相同文件的路径。例如,在 UNIX 上,如果此路径为“/a/b”且给定路径为“/a/b/c/d”,则生成的相对路径将为“c/d”。如果该路径和给定路径没有根组件,则可以构造相对路径。如果只有一个路径具有根组件,则无法构造相对路径。如果两个路径都有一个根组件,那么是否可以构造相对路径取决于实现。如果此路径和给定路径相等,则返回空路径。

对于任意两条归一化路径 p 和 q,其中 q 没有根分量,

p.relativize(p .resolve(q)).equals(q) 如果支持符号链接,那么当针对此路径解析时,生成的路径是否产生可用于定位与其他文件相同的文件的路径是实现依赖。例如,如果此路径是“/a/b”并且给定路径是“/a/x”,那么生成的相对路径可能是“../x”。如果“b”是符号链接,那么如果“a/b/../x”将定位与“/a/x”相同的文件,则取决于实现。

例子

Path dir = Path.of("/var/lib");
Path file = Path.of("/var/lib/someapp/1.txt");
Path relative = dir.relativize(file);
System.out.print(relative);

输出

someapp/1.txt

推荐阅读