使用Java NIO Path对象:
b
和相对路径r
,要获得完整路径f
我可以调用b.resolve(r)
。f
和基本路径b
,要获得相对路径r
我可以调用b.relativize(f)
。f
和r
,并且想找到b
,我该怎么办?查看Path
API,我看不到任何简单/直接的解决方案。我能够想出的最好的是同时迭代getParent()
为f
和r
直到r'
为空/ null,然后f'
应该是b
。但这似乎很笨拙,效率低下。
我也尝试了基于f.subpath()
的解决方案,但该方法剥离了根组件(例如C:\
)。
要检索基本路径,可以使用subpath()
作为开始索引0
and作为结束索引传递完整路径和相对路径之间路径元素的差异,即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);
输出:
基本路径= C:\ folder1中\文件夹2 \一个
请注意,fullPath.getRoot().resolve()
是必需的,因为Windows不考虑使用:
作为其subpath()
实现中的路径元素的标记。
所以在实际的例子中,C:\
永远不会被subpath()
归还。
C:\
在Windows实现中被视为root
组件。
总的来说,即使我们的应用程序在基于Unix的操作系统上运行,我们也应该保持它不依赖于操作系统。 JVM运行的操作系统将来可能会有所不同。