java - 如何在 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”。我的替换有什么问题?
解决方案
相对化!
相对化是分辨率的倒数。此方法尝试构造一个相对路径,当针对此路径解析时,会生成一个与给定路径定位相同文件的路径。例如,在 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
推荐阅读
- dialogflow-es - 此设备不支持 HtmlResponse
- amazon-web-services - 如何在 AWS 中备份 IAM 用户
- android - 从子片段更新操作栏标题
- javascript - 我将如何使用 for 循环而不是使用 [...Array].map() 方法重写此代码?
- spring - 自定义招摇文档/我招摇设置在哪里?
- sql - 在 Oracle 中将带时区的 Varchar 转换为时间戳
- c# - 使用 C# 在 oData 客户端中使用带有延续的 where 子句
- printf - 运行时 c/c++ 项目中的 eclipse 错误。首先打印的输出将为空白。我们进入
- mysql - DATEDIFF(YEAR,C.END_DT,GETDATE()) 的 MySQL Workbench 版本是什么?
- python - 如何获取图像并将其加载到与图像名称相同的变量名称中