《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一2.5.7 使用目录流

简介: 本节书摘来华章计算机《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一书中的第2章 ,第2.5.7节,[美] 凯S.霍斯特曼(Cay S. Horstmann) 著陈昊鹏 译 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.5.7 使用目录流

正如在前一节中所看到的,Files.walk方法会产生一个可以遍历目录中所有子孙的Stream对象。有时,你需要对遍历过程进行更加细粒度的控制。在这种情况下,应该使用File.newDirectoryStream对象,它会产生一个DirectoryStream。注意,它不是java.util.stream.Stream的子接口,而是专门用于目录遍历的接口。它是Iterable的子接口,因此你可以在增强的for循环中使用目录流。下面是其使用
模式:
image

try语句块用来确保目录流可以被正确关闭。访问目录中的项并没有具体的顺序。
可以用glob模式来过滤文件:
image

表2-4展示了所有的glob模式。
image

警告:如果使用Windows的glob语法,则必须对反斜杠转义两次:一次为glob语法转义,一次为Java字符串转义:Files.newDirectoryStream(dir, “C:\\”)
如果想要访问某个目录的所有子孙成员,可以转而调用walkFileTree方法,并向其传递一个FileVisitor类型的对象,这个对象会得到下列通知:

  • 在遇到一个文件或目录时:FileVisitResult visitFile(T path, BasicFileAttributes attrs)
  • 在一个目录被处理前:FileVisitResult preVisitDirectory(T dir, IOException ex)
  • 在一个目录被处理后:FileVisitResult postVisitDirectory(T dir, IOException ex)
  • 在试图访问文件或目录时发生错误,例如没有权限打开目录:FileVisitResult visitFileFailed(path, IOException)
    对于上述每种情况,都可以指定是否希望执行下面的操作:
  • 继续访问下一个文件:FileVisitResult.CONTINUE
  • 继续访问,但是不再访问这个目录下的任何项了:FileVisitResult.SKIP_SUBTREE
  • 继续访问,但是不再访问这个文件的兄弟文(和该文件在同一个目录下的文件)了:FileVisitResult.SKIP_SIBLINGS
  • 终止访问:FileVisitResult.TERMINATE
    当有任何方法抛出异常时,就会终止访问,而这个异常会从walkFileTree方法中

抛出。

注意:FileVisitor接口是泛化类型,但是你也太可能会使用除FileVisitor之外的东西。walkFileTree方法可以接受FileVisitor<? Super Path>类型的参数,但是Path并没有多少超类型。
便捷类SimpleFileVisitor实现了FileVisitor接口,但是其除visitFileFailed方法之外的所有方法并不做任何处理而是直接继续访问,而visitFileFailed方法会抛出由失败导致的异常,并进而终止访问。
例如,下面的代码展示了如何打印出给定目录下的所有子目录:
image

值得注意的是,我们需要覆盖postVisitDirectory方法和visitFileFailed方法,否则,访问会在遇到不允许打开的目录或不允许访问的文件时立即失败。
还应该注意的是,路径的众多属性是作为preVisitDirectory和visitFile方法的参数传递的。访问者不得不通过操作系统调用来获得这些属性,因为它需要区分文件和目录。因此,你就不需要再次执行系统调用了。
如果你需要在进入或离开一个目录时执行某些操作,那么FileVisitor接口的其他方法就显得非常有用了。例如,在删除目录树时,需要在移除当前目录的所有文件之后,才能移除该目录。下面是删除目录树的完整代码:
image
image
image

目录
打赏
0
0
0
0
1408
分享
相关文章
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
115 11
【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
【10月更文挑战第17天】Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
127 2
linux中HADOOP_HOME和JAVA_HOME删除后依然指向旧目录
通过以上步骤,可以有效地解决 `HADOOP_HOME`和 `JAVA_HOME`删除后依然指向旧目录的问题。确保在所有相关的配置文件中正确设置和删除环境变量,并刷新当前会话,使更改生效。通过这些措施,能够确保系统环境变量的正确性和一致性。
63 1
|
6月前
|
优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。
【10月更文挑战第19天】本文介绍了如何优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。内容包括Map的初始化、使用Stream API处理Map、利用merge方法、使用ComputeIfAbsent和ComputeIfPresent,以及Map的默认方法。这些技巧不仅提高了代码的可读性和维护性,还提升了开发效率。
210 3
Java Map新玩法:深入探讨HashMap和TreeMap的高级特性
【10月更文挑战第19天】Java Map新玩法:深入探讨HashMap和TreeMap的高级特性,包括初始容量与加载因子的优化、高效的遍历方法、线程安全性处理以及TreeMap的自然排序、自定义排序、范围查询等功能,助你提升代码性能与灵活性。
50 2
大数据-58 Kafka 高级特性 消息发送02-自定义序列化器、自定义分区器 Java代码实现
大数据-58 Kafka 高级特性 消息发送02-自定义序列化器、自定义分区器 Java代码实现
124 3
大数据-73 Kafka 高级特性 稳定性-事务 相关配置 事务操作Java 幂等性 仅一次发送
大数据-73 Kafka 高级特性 稳定性-事务 相关配置 事务操作Java 幂等性 仅一次发送
68 2
Java——图片文件位于 bin 目录下,下载新图片会导致应用程序重启
【9月更文挑战第22天】在Java应用中,若图片位于bin目录下且下载新图片导致应用重启,可能是因为部署方式不当或资源监控机制过于敏感。解决方法包括:更改图片存储位置至独立目录;配置应用服务器减少资源监控敏感度;使用独立资源服务器托管静态资源;优化代码减少资源重复加载。具体方案需根据应用实际情况和技术栈调整。
|
8月前
|
点击按钮,向下添加目录。Java script+jQuery写法
点击按钮,向下添加目录。Java script+jQuery写法
49 1