我正在研究Java NIO.2及其文件操作,目前正在使用文件树遍历函数和类。

NIO.2 FileVisitor API很棒,令人遗憾的是,这种东西仅在最近而不是十年前才被添加到Java SE中。但是,有些事情令我有些困扰:使FileVisitor接口(interface)通用是什么意思?

网上的每个示例都展示了如何将其与Files.walkFileTree()一起使用,这意味着我们正在使用FileVisitor<Path>类型。但是除了Path之外,我只是看不到此接口(interface)的任何用途。好吧,也许可以使用FileVisitor遍历其他种类的树(内存中的树?),但这感觉并不对:此接口(interface)和相关类的语义上非常特定的名称与文件相关联,而且FileVisitor'的方法抛出IOException

那么,是否有理由对FileVisitor类型进行参数化?

最佳答案

使用泛型,相同的接口(interface)可用于其他类型的路径。如以下(简化的)代码片段所示,该接口(interface)可与java.io.File配合使用:

FileVisitResult walk(File file, FileVisitor<File> visitor)
    throws IOException
{
    if (file.isDirectory()) {
        visitor.preVisitDirectory(file, null);
        for (File child : file.listFiles()) {
            walk(child, visitor);
        }
        return visitor.postVisitDirectory(file, null);
    } else {
        return visitor.visitFile(file, null);
    }
}

10-07 23:01