使用 Java NIO Path 对象:
- 如果我有一个基本路径
b
和一个相对路径r
,要获得完整的路径f
我可以调用b.resolve(r)
. - 如果我有完整的路径
f
和基本路径b
,以获得相对路径r
我可以调用b.relativize(f)
. - 但是,如果我有
f
和r
,并且想找到b
,我该怎么办?
查看Path
API,我看不到任何简单/直接的解决方案。 我能想到的最好的办法是同时迭代getParent()
f
和r
,直到r'
为空/空,然后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);
输出:
basePath=C:\folder1\folder2\a
请注意,fullPath.getRoot().resolve()
是必需的,因为 Windows 在其subpath()
实现中不会将带有 :
的令牌视为路径元素。
所以在实际示例中,C:
永远不会被subpath()
返回。
C:
在 Windows 实现中被视为root
组件。
作为一般说明,即使我们的应用程序在基于 Unix 的操作系统上运行,我们也应该保持它不依赖于操作系统。运行 JVM 的操作系统将来可能会有所不同。