12

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

NIO.2 FileVisitorAPI 很棒,可惜最近才在 Java SE 中添加这样的东西,而不是十年前。然而,有一点让我有点困扰:使FileVisitor接口通用的意义何在?

网上的每一个例子都展示了如何使用它,Files.walkFileTree()这意味着我们正在使用FileVisitor<Path>类型。但我只是看不到这个接口对Path. 好吧,也许可以FileVisitor用来遍历其他类型的树(内存中的树?),但这感觉不对:这个接口和相关类具有与文件语义相关的非常具体的名称,以及FileVisitor's 方法扔IOExceptions.

FileVisitor那么,参数化类型有什么原因吗?

4

2 回答 2

5

你使用GitHub吗?这将是使用FileVisitorGitHub 实现 API 的绝佳机会,允许您探索/可视化 GitHub 项目。就此而言,几乎任何 SCC 系统都可以使用不同的类作为文件定位器

以及如何使用 aFileVisitor<ZipEntry>来遍历 zip 文件。

如果一个 API 可能可用于多个对象作为其目标,那么将其设为通用是有意义的。我认为使其通用将被认为是愚蠢的错误。

于 2013-05-06T22:03:54.997 回答
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);
    }
}
于 2013-05-06T22:04:28.123 回答