使用 Java 仅访问特定深度的目录 7

Visit only directories of a specific depth with Java 7

使用方法时

java.nio.file.Files.walkFileTree(Path root, Set options, int maxDepth, FileVisitor visitor)

可以指定要访问的文件的最大深度。还有一种方法可以指定只访问特定的 exact 深度的路径吗?

更具体地说,我只想访问目录,但这可以很容易地用

检查
if (attrs.isDirectory()) {
    // do something
}

visitFile 回调中。


示例:假设我有一个包含文件 root/dir1/dir11/file.aroot/dir2/file.b 的目录结构,并且我使用 maxDepth=2root 上调用 walkFileTree。然后,我只想处理

root/dir1/dir11

我既不想处理深度也为二的文件 root/dir2/file.b,也不想处理深度小于二的其他目录路径:

root
root/dir1
root/dir2

有趣的是,天真的实现完全符合我的要求:

Files.walkFileTree(root, EnumSet.noneOf(FileVisitOption.class), 2, new SimpleFileVisitor<Path>() {
    @Override
    public FileVisitResult visitFile(Path path, BasicFileAttributes attrs) throws IOException {
        if (attrs.isDirectory()) {
            process(path);
        }
        return FileVisitResult.CONTINUE;
    }
});

也就是说,对于给定的示例,它只会处理 root/dir1/dir11

该解决方案使用明显矛盾的方法来过滤访问文件中的目录。然而,walkFileTree 的 JavaDoc 解释了为什么这会导致所需的行为:

For each file encountered this method attempts to read its java.nio.file.attribute.BasicFileAttributes. If the file is not a directory then the visitFile method is invoked with the file attributes. (...)

The maxDepth parameter is the maximum number of levels of directories to visit. (...) The visitFile method is invoked for all files, including directories, encountered at maxDepth (...)