使用Java NIO Path对象:
b和相对路径r,则f可以调用完整路径b.resolve(r)。f和基本路径b,则r可以调用相对路径b.relativize(f)。fand r并想找到我该怎么办b?查看PathAPI,我看不到任何简单/直接的解决方案。我能想到的最好的办法是同时getParent()为两个迭代f,r直到r'为空/ null,然后f'应该为b。但这似乎笨拙且效率低下。
我还尝试了基于的解决方案,f.subpath()但是该方法剥离了根组件(例如C:\)。
要检索基本路径,可以subpath()通过传递0完整路径和相对路径之间的路径元素之差作为开始索引 和结束索引来使用,即fullPath.getNameCount() - relativePath.getNameCount()
例如 :
Path fullPath = Paths.get("C:/folder1/folder2/a/b/c.txt");
Path relativePath = Paths.get("b/c.txt");
Path basePath = fullPath.getRoot().resolve(fullPath.subpath(0, fullPath.getNameCount() - relativePath.getNameCount()));
System.out.println("basePath=" + basePath);
Run Code Online (Sandbox Code Playgroud)
输出:
basePath = C:\ folder1 \ folder2 \ a
请注意,这fullPath.getRoot().resolve()是必需的,因为Windows :在其subpath()实现中不会将令牌视为路径元素。
因此,在实际示例中,C:\将永远不会返回subpath()。
C:\在Windows实施中被视为root组件。
作为一般说明,即使我们的应用程序在基于Unix的操作系统上运行,我们也应使其不依赖于操作系统。JVM运行的操作系统将来可能会有所不同。