为啥 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
的方法也会抛出 IOException
s。
那么,参数化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
应用于常规File
s。【参考方案2】:
你使用GitHub吗?这将是使用FileVisitor
实现 GitHub API 的绝佳机会,允许您探索/可视化 GitHub 项目。就此而言,几乎任何 SCC 系统都可以使用不同的类作为文件定位器
以及如何使用FileVisitor<ZipEntry>
遍历 zip 文件。
如果一个 API 有可能用于多个对象作为它的目标,那么让它成为通用的就很有意义。我认为不将其泛化会被认为是愚蠢的错误。
【讨论】:
谢谢,VCS 确实是FileVisitor
应用程序的一个很好的例子。然而,FileVisitor
接口看起来真的是半通用的;是的,它是由 path 类型参数化的,但为什么它也不是由 attributes 类型参数化的呢?它总是使用BasicFileAttributes
。 IOException
似乎也有点限制。而且FileVisitor<ZipEntry>
需要一些复杂的逻辑,因为ZipInputStream
提供的ZIP 文件结构是扁平的,并且可能不包含正确顺序的条目。
@VladimirMatveev - 您会从 Mercurial/Git/SVN VCS 中呈现哪些属性?它不会与HFS有很大不同吗?此外,zip 文件根本不是平面的。您可以在 zip 中拥有等效的目录 - 它们是 zip 文件。将一个 zip 文件压缩成一个 zip 文件,您就拥有了一个文件夹。
嗯,VCS 文件系统可能会为每个文件提供修订信息、差异、更改日志等 - 这都是元信息,不是吗?而且 zip 文件中的 zip 文件真的很奇怪,在实践中从未遇到过。 AFAIK 所有当前的归档器都将目录表示为由斜杠分隔的路径。不过,这并不会破坏示例,这样的档案确实可以对文件系统进行建模。以上是关于为啥 NIO.2 FileVisitor 类型是泛型的?的主要内容,如果未能解决你的问题,请参考以下文章
java中,数组既可以存放基本数据类型,又可以存放对象。为啥集合中存放的就必须是对象?