我正在处理使用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次和最后一次迭代。
我正在寻找一个使用Path
和java.nio
而不是旧方法的好解决方案。我知道我可以使用旧的io
API实现这一点,但我对使用nio
的正确方法感兴趣。
答案 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)
假设base
和end
部分是参数,而中间部分是固定的,解决方案可能如下所示:
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"));
}
一旦遇到非目录路径组件,它就会停止迭代。如果要强制执行有关跟随符号链接的特定策略,则必须调整此行为...