迭代Java中Path的某些子路径

时间:2014-12-19 10:46:40

标签: java nio

我正在处理使用java.nio.file.Path的代码。我有一条像

这样的道路

/tmp/something/first/second/third/last

我只看到

{parent.dir}/first/second/third/{path.end}

在此示例中,/tmp/something{parent.dir}是一个在运行时可能不同的路径,对我来说无关紧要。这同样适用于路径{path.end}

中的最后一个元素

我需要的是迭代{parent.dir}{path.end}之间的元素。基本上测试路径中的每个元素(如果它存在)以及它是文件还是 目录或其他东西(没关系)。

因此,我正在寻找一些优雅/简单且正确的方法来迭代Path的实例,我可以访问这些路径:

/tmp
/tmp/something/
/tmp/something/first
...
/tmp/something/first/second/third/last

理想情况下,在这种情况下没有前2次和最后一次迭代。

我正在寻找一个使用Pathjava.nio而不是旧方法的好解决方案。我知道我可以使用旧的io API实现这一点,但我对使用nio的正确方法感兴趣。

2 个答案:

答案 0 :(得分:0)

这里我打印父目录的所有子目录:

Files.walk(Paths.get(${parent.dir})).filter(path -> Files.isDirectory(path, LinkOption.NOFOLLOW_LINKS)).forEach(System.out::println);

您可以将另一个lambda传递给forEach方法以用于您自己的目的。
还要将$ {parent.dir}替换为正确的值作为String。
(上面的代码可能会抛出IOException)。

答案 1 :(得分:0)

假设baseend部分是参数,而中间部分是固定的,解决方案可能如下所示:

static void iterate(Path base, Path end) {

  if(!base.isAbsolute() || end.isAbsolute()) throw new
      IllegalArgumentException("base must be absolute, end must be relative");

  // test the fixed in-between paths
  Path fixed=Paths.get("first", "second", "third");
  for(Path part: fixed) {
    base=base.resolve(part);
    System.out.print(base);
    if(Files.isDirectory(base)) {
      System.out.println(" is a directory");
    }
    else {
      System.out.println(Files.exists(part)?" is not a directory":" does not exist");
      return;
    }
  }

  // test the end path
  end=base.resolve(end);
  System.out.print(end+(
    Files.isDirectory(end)? " is a directory":
    Files.exists(end)? " is not a directory": " does not exist"));
}

一旦遇到非目录路径组件,它就会停止迭代。如果要强制执行有关跟随符号链接的特定策略,则必须调整此行为...