为什么NIO.2中的FileVisitor类型是泛型的?

12

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

NIO.2的FileVisitor API非常出色。令人惋惜的是,这种东西只是最近才被添加到Java SE中,而不是十年前。然而,有一件事情让我稍微感到困扰:为什么要使FileVisitor接口成为通用接口?

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

那么,为什么要将FileVisitor类型参数化呢?


猜测:FileVisitor 可能也可用于访问其他文件系统,例如HDFS - ValarDohaeris
2个回答

5

泛型可以使接口适用于其他类型的路径。如下所示(简化)代码片段,该接口与 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);
    }
}

是的,这正是我在写完问题几分钟后想到的,可以将FileVisitor应用于普通的File - Vladimir Matveev

5
你使用GitHub吗?使用FileVisitor实现一个API到GitHub将使您能够探索/可视化GitHub项目。事实上,几乎任何SCC系统都可以使用不同的类作为文件定位器。
那么,如何使用FileVisitor<ZipEntry>遍历zip文件呢?
如果一个API可能与多个对象作为其目标一起使用,那么将其通用化就是有意义的。我认为不通用会是一个应该被认为是愚蠢的错误。

谢谢,VCSes确实是FileVisitor应用的非常好的例子。然而,FileVisitor接口看起来确实有点半通用;是的,它是由path类型参数化的,但为什么它也不是由attributes类型参数化的呢?它总是使用BasicFileAttributesIOException也似乎有些限制。而且,FileVisitor<ZipEntry>将需要一些复杂的逻辑,因为由ZipInputStream提供的ZIP文件结构是平面的,可能不包含正确顺序的条目。 - Vladimir Matveev
@VladimirMatveev - 你会从Mercurial/Git/SVN VCS中提出哪些属性?这与HFS显然有很大不同。此外,zip文件并不是完全扁平的。在zip文件中可以有类似目录的结构 - 它们就是zip文件。将一个zip文件压缩到另一个zip文件中,你就拥有了一个文件夹的等效物。 - OldCurmudgeon
好的,版本控制系统文件系统可以为每个文件提供修订信息、差异、更改日志等-这都是元信息,不是吗?而且,zip 文件中的 zip 文件真的很奇怪,在实践中从未遇到过。据我所知,所有当前的存档程序都将目录表示为通过斜杠分隔的路径。虽然如此,这并不破坏示例,这样的归档文件确实可以模拟文件系统。 - Vladimir Matveev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接