Java NIO路径:如何从完整路径获取基础路径?

3

使用 Java NIO Path 对象:

  • 如果我有一个基本路径 b 和一个相对路径 r,要获取完整路径 f,我可以调用 b.resolve(r)
  • 如果我有完整路径 f 和基本路径 b,要获取相对路径 r,我可以调用 b.relativize(f)
  • 但是如果我有 fr,想要找到 b 怎么办?

查看 Path API,我没有看到任何简单/直接的解决方案。我能想到的最好的方法是同时迭代 frgetParent(),直到 r' 为空/ null,然后 f' 应该是 b。但这似乎笨拙而低效。

我还尝试了基于f.subpath()的解决方案,但该方法会剥离根组件(例如C:\)。


你看到了 https://docs.oracle.com/javase/8/docs/api/java/nio/file/Path.html#endsWith-java.nio.file.Path- 吗? - The Guest
@TheGuest endsWith() 可以告诉我 r 是否真正相对于 f,这很有用,但我需要进一步推导出 b - Kevin K
1个回答

7
为了获取基本路径,您可以使用 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() 返回。
在 Windows 实现中,C:\ 被视为 root 组件。

总之,即使我们的应用程序在基于 Unix 的操作系统上运行,也应该保持不依赖于操作系统。JVM 运行的操作系统可能会在未来发生变化。


这是我考虑过的解决方案之一,但正如我在问题中提到的那样,它会从路径中剥离根组件。例如,如果 fullPathC:\folder1\...(在 Windows 上),basePath 最终仍然会变成 folder1\...。我需要 basePath 变成 C:\folder1\... - Kevin K
我想我可以做类似fullPath.getRoot().resolve(basePath);这样的事情来恢复根组件。虽然不如我想象中优雅,但也许这就是最好的了... - Kevin K
实际上,对于Windows路径,你可能会去掉驱动器。这是由于“:”字符引起的。这确实不太优雅,但你没有太多选择,因为nio API没有提供一种方法来找到完整路径和相对路径之间的基本路径。 - davidxxx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接