【问题标题】:Java NIO Paths: getting the base path from a full path?Java NIO 路径:从完整路径获取基本路径?
【发布时间】:2018-08-13 13:42:48
【问题描述】:

使用Java NIO Path 对象:

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

查看Path API,我看不到任何简单/直接的解决方案。我能想到的最好方法是同时对getParent()fr 进行迭代,直到r' 为空/null,然后f' 应该是b。但这似乎笨拙且效率低下。

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

【问题讨论】:

标签: java path nio


【解决方案1】:

要检索基本路径,您可以使用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() 实现中不会将带有 : 的令牌视为路径元素。
所以在实际示例中,subpath() 永远不会返回C:\
C:\ 在 Windows 实现中被视为root 组件。

一般来说,即使我们的应用程序在基于 Unix 的操作系统上运行,我们也应该让它不依赖于操作系统。以后运行JVM的操作系统可能会有所不同。

【讨论】:

  • 这是我考虑的解决方案之一,但正如我在问题中提到的那样,它会从路径中剥离根组件。例如,如果 fullPathC:\folder1\...(在 Windows 上),basePath 仍会以 folder1\... 结尾。我需要basePath 成为C:\folder1\...
  • 我想我可以执行fullPath.getRoot().resolve(basePath); 之类的操作来恢复根组件。它没有我想要的那么优雅,但也许已经很好了......
  • 确实,对于 Windows 路径,您可能会剥离驱动器。它是由: 字符引起的。它确实不是很优雅,但是您没有太多选择,因为 nio api 没有提供一种方法来查找完整路径和相对路径之间的基本路径。
猜你喜欢
  • 2011-12-11
  • 1970-01-01
  • 2017-03-16
  • 1970-01-01
  • 2019-07-08
  • 2019-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多