java.nio.file.Path.contains(subPath)?

Rol*_*and 5 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
Run Code Online (Sandbox Code Playgroud)

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

Rol*_*and 1

我想出的是以下内容:

\n
boolean containsSubPath(Path someRealPath, Path subPathToCheck) {\n  return someRealPath.normalize()\n                     .toString()\n                     .contains(subPathToCheck.normalize()\n                                             .toString());\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这样我就可以调用:

\n
containsSubPath(Paths.get("/tmp/some/path/to/somewhere"), Paths.get("some/path"));\n
Run Code Online (Sandbox Code Playgroud)\n

正如 Thomas Kl\xc3\xa4ger 指出的那样,该解决方案还匹配路径,这些路径只是真实路径的子字符串(对于我的用例来说也可以)。

\n

这是另一个可能更正确的解决方案(对于完整匹配的子路径),但仍然没有我希望的那么短(现在由于 Kabhals 输入而得到纠正):

\n
static boolean containsSubPath(Path realPath, Path subPath) {\n  for (Path realPathSegment : realPath.normalize()) {\n    if (containsSubPath(realPathSegment.iterator(), subPath.normalize().iterator())) {\n      return true;\n    }\n  }\n  return false;\n}\nprivate static boolean containsSubPath(Iterator<Path> realPathIterator, Iterator<Path> subPathIterator) {\n  var hasEntries = realPathIterator.hasNext() && subPathIterator.hasNext();\n  while (realPathIterator.hasNext() && subPathIterator.hasNext()) {\n    Path realPathSegment = realPathIterator.next();\n    Path subPathSegment = subPathIterator.next();\n    if (!Objects.equals(realPathSegment, subPathSegment))\n      return false;\n  }\n  return hasEntries;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
containsSubPath(Paths.get("/tmp/some/path/to/somewhere"), Paths.get("some/path")) // true\ncontainsSubPath(Paths.get("/tmp/some/path/to/somewhere"), Paths.get("me/pa")) // false\n
Run Code Online (Sandbox Code Playgroud)\n

如果您需要使用它,BinaryOperator只需使用方法引用即可,即YourClass::containsSubPath.

\n