为啥 NIO.2 FileVisitor 类型是泛型的?

Posted

技术标签:

【中文标题】为啥 NIO.2 FileVisitor 类型是泛型的?【英文标题】:Why is NIO.2 FileVisitor type generic?为什么 NIO.2 FileVisitor 类型是泛型的? 【发布时间】:2013-04-30 15:57:05 【问题描述】:

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

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

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

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

【问题讨论】:

推测:FileVisitor 也可用于访问其他文件系统,例如HDFS. 【参考方案1】:

使用泛型,相同的接口可用于其他类型的路径。如以下(简化的)代码片段所示,该界面与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 应用于常规Files。【参考方案2】:

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

以及如何使用FileVisitor&lt;ZipEntry&gt; 遍历 zip 文件。

如果一个 API 有可能用于多个对象作为它的目标,那么让它成为通用的就很有意义。我认为将其泛化会被认为是愚蠢的错误。

【讨论】:

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

以上是关于为啥 NIO.2 FileVisitor 类型是泛型的?的主要内容,如果未能解决你的问题,请参考以下文章

java中,数组既可以存放基本数据类型,又可以存放对象。为啥集合中存放的就必须是对象?

结果类型是泛型类型上的类型投影的隐式转换

什么是泛型

Java中的Class类的newinstance方法返回值为啥是object类型的?

什么是泛型?泛型的基本原理与使用优势。

什么是泛型?泛型的基本原理与使用优势。