java.nio.file.Path.contains(子路径)?

时间:2017-03-20 12:16:03

标签: java nio

我需要检查给定路径是否是另一条路径中任何地方的子路径,并且在编写自己的路径之前想知道是否存在这样的方法。

以下是一些可能有助于理解问题的代码:

Path someRealPath = Paths.get("/tmp/some/path/to/somewhere");
Path subpathToCheck = Paths.get("some/path");

// I am expecting something similar as follows:
someRealPath.contains(subPathToCheck) // should return true in this case
someRealPath.contains(Paths.get("some/to")) // should return false

我已经看过relativize,但我认为这不是解决问题的最简单方法。我提出的最简单的是normalize().toString().contains(/* other normalized string path */)。但也许有一种更简单的方法? Paths中的许多方法看起来好像这个功能必须已经在那里。也许我只是没有看到它。

1 个答案:

答案 0 :(得分:0)

我想出的是以下内容:

BiPredicate<Path, Path> containsSubPath = 
    (someRealPath, subPathToCheck) -> someRealPath.normalize()
                                                  .toString()
                                                  .contains(subPathToCheck.normalize()
                                                                          .toString())

这样我就可以打电话:

containsSubPath.test(Paths.get("/tmp/some/path/to/somewhere"), Paths.get("some/path"));

正如ThomasKläger所指出的,这个解决方案也匹配路径,它们只是真实路径的子串(对我的用例来说也可以)。

这是另一个可能更正确的解决方案(对于完全匹配的子路径),但仍然没有我想要的那么短:

BiPredicate<Path, Path> containsSubPath = (realPath, subPath) -> {
  Iterator<Path> realPathIterator = realPath.normalize().iterator();
  Iterator<Path> subPathIterator = subPath.normalize().iterator();

  while (realPathIterator.hasNext()) {
    Path realPathSegment = realPathIterator.next();
    if (subPathIterator.hasNext()) {
      Path subPathSegment = subPathIterator.next();
      if (!Objects.equals(realPathSegment, subPathSegment)) {
        subPathIterator = subPath.normalize().iterator();
      }
    } else {
      break;
    }
  }
  return !subPathIterator.hasNext();
};

具有预期输出的示例调用:

containsSubPath.test(Paths.get("/tmp/some/path/to/somewhere"), Paths.get("some/path")) // true
containsSubPath.test(Paths.get("/tmp/some/path/to/somewhere"), Paths.get("me/pa")) // false