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

     2023-02-19     31

关键词:

【中文标题】为啥 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 所有当前的归档器都将目录表示为由斜杠分隔的路径。不过,这并不会破坏示例,这样的档案确实可以对文件系统进行建模。

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

】结果类型是泛型类型上的类型投影的隐式转换【英文标题】:Implicitconversionwherethereresultingtypeisatypeprojectiononagenerictype【发布时间】:2021-10-2702:32:42【问题描述】:我有一些基本上可以归结为这个的scala2.13代码importscala.language.imp... 查看详情

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

集合里只能存放引用类型,若要存放基本类型只能存相对应的包装类原因是因为集合是泛型类,会有边界擦除,若在<>里指定类型就保留到你指定的类的信息,若不指定就为Object类,基本类型自动转为相应的包装类存放所以你... 查看详情

什么是泛型?泛型的基本原理与使用优势。(代码片段)

...泛型例子3.那么T是什么呢?4.如何使用泛型,并将类型作为参数传入呢?5.泛型的基本原理6.使用泛型的好处1.什么是泛型?泛型将接口的概念进一步延伸,“泛型”的字面意思就是广泛的类型。类、接口和方法... 查看详情

关于泛型,什么是泛型,如何理解泛型,直接上代码举例

泛型是JDK5中引入的特性,它提供了编译时类型安全检测机制,该机制允许在编译时检测到非法的类型,就不至于在运行时出现转换异常, 它的本质是参数化类型(即以任何类型T作为参数,<T>,在使用时可以传入类型T的... 查看详情

java中啥是泛型,怎么用泛型?

...在初级和中级面试中:1:什么是泛型?泛型就是广泛的类型,也是一种数据类型,而这种数据类型可以是任意类型,编写过程中当中不能确定类型,创建对象时必须指定具体类型,不指定也可以,但是会出现一些错误。泛型是... 查看详情

优先使用泛型方法

正如类可以是泛型的,方法也可以是泛型的。对参数化类型进行操作的静态工具方法通常都是泛型的。集合中的所有“算法”方法(如binarySearch和sort)都是泛型的。//Usesrawtypes-unacceptable![Item26]publicstaticSetunion(Sets1,Sets2)Setres... 查看详情

为啥硝酸和硝酸盐类是特定种类危险化学品

上面回答的什么鬼,答非所问。硝酸是腐蚀品;硝酸盐类是强氧化剂,与有机物接触能燃烧爆炸,硝酸钾还用来制火药。参考技术A泛型可以用"<T>"代表,任意类型的。解释:“<T>”是泛型的默认值,可以被任意... 查看详情

什么是泛型?(c#概念)

...的解释或者比方。在给你比较好懂的:通过泛型可以定义类型安全类,而不会损害类型安全、性能或工作效率。您只须一次性地将服务器实现为一般服务器,同时可以用任何类型来声明和使用它。为此,需要使用<和>括号,... 查看详情

什么是泛型?(c#概念)

...的解释或者比方。在给你比较好懂的:通过泛型可以定义类型安全类,而不会损害类型安全、性能或工作效率。您只须一次性地将服务器实现为一般服务器,同时可以用任何类型来声明和使用它。为此,需要使用<和>括号,... 查看详情

nio---2

packagecom.atguigu.nio;importjava.io.IOException;importjava.nio.ByteBuffer;importjava.nio.channels.FileChannel;importjava.nio.channels.SeekableByteChannel;importjava.nio.file.DirectoryStream;importjav 查看详情

IO 性能:Selector (NIO) vs AsynchronousChannel(NIO.2)

】IO性能:Selector(NIO)vsAsynchronousChannel(NIO.2)【英文标题】:IOperformance:Selector(NIO)vsAsynchronousChannel(NIO.2)【发布时间】:2015-02-1622:15:51【问题描述】:奇怪的是,我无法在Google中找到关于NIO.2异步IO性能与通过java.nio.channels.Selector使用N... 查看详情

Java:NIO 和 NIO.2 到底有啥区别?

】Java:NIO和NIO.2到底有啥区别?【英文标题】:Java:whatexactlyisthedifferencebetweenNIOandNIO.2?Java:NIO和NIO.2到底有什么区别?【发布时间】:2014-10-2115:49:10【问题描述】:我不太明白它们之间有什么不同,所以我对这两个包有一些疑问... 查看详情

java中的class类的newinstance方法返回值为啥是object类型的?

如题返回的是Class<T>,这里的T是泛型,所以只有返回Object才能满足接收任何类型的对象参考技术A你好,很高兴回答你的问题。因为这是一个抽象化的方法。不是针对具体的某一个类型。所以返回的是所有类的最终父类Object... 查看详情

io和nio的思考

...,大致分为两类:面向磁盘和面向网络。在Java中有3种I/O类型:BIO、NIO和AIO,分别是同步阻塞、同步非阻塞和异步非阻塞I/O,这里着重描述BIO和NIO的区别和常用的编程模型。1.为什么设计NIO一个直接原因就是为了更好的利用操作... 查看详情

nio2.0之copydelete和move

转自:http://www.importnew.com/15884.htmlJava7引入了NIO.2,NIO.2是继承自NIO框架,并增加了新的功能(例如:处理软链接和硬链接的功能)。这篇帖子包括三个部分,我将使用NIO.2的一些示例,由此向大家演示NIO.2的基本使用方法。文件拷... 查看详情

Java 7 NIO.2 Files.getLastModifiedTime 时区

】Java7NIO.2Files.getLastModifiedTime时区【英文标题】:Java7NIO.2Files.getLastModifiedTimetimezone【发布时间】:2013-08-2813:43:42【问题描述】:我正在编写一个需要确定文件/目录上次修改时间的程序。我想使用JodaTime处理这个时间,并且我正在... 查看详情

《java程序设计》周结(10)

...怎样使用。首先就先说说什么是泛型,泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类... 查看详情

大数据学习之scala语言的高级特性42

1、什么是泛型类和Java或者C++一样,类和特质可以带类型参数。在Scala中,使用方括号来定义类型参数测试程序: 2、什么是泛型函数函数和方法也可以带类型参数。和泛型类一样,我们需要把类型参数放在方法名之后。注意... 查看详情