2

使用方法时

java.nio.file.Files.walkFileTree(路径根,设置选项,int maxDepth,FileVisitor 访问者)

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

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

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

visitFile回调中。


示例:假设我有一个包含文件的目录结构,root/dir1/dir11/file.a并且root/dir2/file.bwalkFileTree使用. 然后,我只想处理rootmaxDepth=2

root/dir1/dir11

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

root
root/dir1
root/dir2
4

1 回答 1

3

有趣的是,天真的实现正是我想要的:

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.

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

对于遇到的每个文件,此方法都会尝试读取其 java.nio.file.attribute.BasicFileAttributes。如果文件不是目录,则使用文件属性调用 visitFile 方法。(...)

maxDepth 参数是要访问的目录的最大级别数。(...) 对 maxDepth (...) 遇到的所有文件(包括目录)调用 visitFile 方法

于 2015-06-24T12:16:02.660 回答