[疯狂Java]NIO.2:walkFileTree、FileVisitor(遍历文件/目录)

2023-10-27

1. 遍历文件和目录——FileVisitor:

    1) 在旧版本中遍历文件系统只能通过递归的方法来实现,但是这种方法不仅消耗资源大而且效率低;

    2) NIO.2的Files工具类提供了一个静态工具方法walkFileTree来高效并优雅地遍历文件系统;

    3) walkFileTree:

         i. 原型:static Path Files.walkFileTree(Path start, FileVisitor<? super Path> visitor);

         ii. 表示从start代表的节点开始遍历文件系统;

         iii. 其中visitor是遍历过程中的行为控制器;

    4) 遍历行为控制器——FileVisitor:

         i. 它是一个接口,里面定义了4个方法用来指定当你访问一个节点之前、之中、之后、失败时应该采取什么行动;

         ii. 这个设计非常优雅和科学,毕竟你在遍历文件系统时想要做的事情无外乎发生在这几个时间点上,Java全部为你考虑好了,并搭好了框架!多么的贴心!!

         iii. API:

public interface FileVisitor<T> {

    FileVisitResult preVisitDirectory(T dir, BasicFileAttributes attrs) // 访问一个目录前要干啥
        throws IOException;
    
    FileVisitResult postVisitDirectory(T dir, IOException exc) // 访问一个目录后要干啥
            throws IOException;

    FileVisitResult visitFile(T file, BasicFileAttributes attrs) // 正在访问一个文件时要干啥
        throws IOException;
    
    FileVisitResult visitFileFailed(T file, IOException exc) // 访问一个文件失败时要干啥
        throws IOException;
}
!!注意,里面的文件和目录要区别开;

!可以看到它是一个模板接口,但是在walkFileTree中它的类型已经确定了就是Path,因此里面的T类型就是Path类型了;

        iv. 接口方法的返回值FileVisitResult是一个枚举类型,walkFileTree就是会根据这个返回值决定是否要继续遍历下去,如果要继续遍历则应该怎样遍历,它总共有4个枚举值:都是FileVisitResult中定义的枚举值

CONTINUE:继续遍历

SKIP_SIBLINGS:继续遍历,但忽略当前节点的所有兄弟节点直接返回上一层继续遍历

SKIP_SUBTREE:继续遍历,但是忽略子目录,但是子文件还是会访问;

TERMINATE:终止遍历

    5) 实际使用中通常直接继承FileVisitor的适配器SimpleFileVisitor,因为只需要实现你感兴趣的方法即可,无需4个方法全部都实现;

    6) 示例:

public class Test {
	
	public static void main(String[] args) throws IOException {
		
		Files.walkFileTree(Paths.get(".."), new SimpleFileVisitor<Path>() {

			@Override
			public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
				// TODO Auto-generated method stub
				// return super.preVisitDirectory(dir, attrs);
				System.out.println("正在访问:" + dir + "目录");
				return FileVisitResult.CONTINUE;
			}

			@Override
			public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
				// TODO Auto-generated method stub
				// return super.visitFile(file, attrs);
				System.out.println("\t正在访问" + file + "文件");
				if (file.endsWith("Test.java")) {
					System.out.println("******找到目标文件Test.java******");
					return FileVisitResult.TERMINATE; // 找到了就终止
				}
				return FileVisitResult.CONTINUE; // 没找到继续找
			}
			
		});
	}
}
!!Path可以像String那样进行字符串校验,校验路径中的字符串:都是Path的对象方法

        a. boolean startsWith(String other); // 前缀检查

        b. boolean startsWith(Path other);

        c. boolean endsWith(String other); // 后缀检查

        d. boolean endsWith(Path other);

!!比较的都是其path成员字符串里的内容,并不会深入文件系统用完整的绝对路径来比较

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[疯狂Java]NIO.2:walkFileTree、FileVisitor(遍历文件/目录) 的相关文章

随机推荐

  • 闲谈:如何在js中定义枚举类

    定义枚举的意义和场景 今天遇到了一个场景 页面中有一个下拉框 里面两个选项 国有企业 民营企业 代码结构是这样的 text 国有企业 value 1 text 民营企业 value 2 value是用来存储 text是用来展示 数据回显的时
  • QT错误::-1: error: No rule to make target ‘res.qrc‘, needed by ‘debug/qrc_res.cpp‘. Stop.

    问题分析 出现这种错误是因为选中的资源文件的图片路径中含有中文 解决办法 先删除原有图片路径中含有中文的图片 将图片的路径中含有中文的部分修改后再进行添加 然后再重新执行即可
  • 【Vue】一文让你进入Vue的大门

    Vue简介 官网 英文官网 中文官网 介绍与描述 Vue历史 Vue 是一套用来动态构建用户界面的渐进式JS框架 构建用户界面 把数据通过某种办法变成用户界面 渐进式 Vue可以自底向上逐层的应用 简单应用只需要一个轻量小巧的核心库 复杂应
  • iOS 多线程知识体系构建(二):Pthreads、NSThread篇

    本篇首先来学习 iOS 多线程技术中的 Pthreads 和 NSThread Pthreads 可移植操作系统接口 英语 Portable Operating System Interface 缩写为POSIX 是 IEEE 电气和电子工
  • 解决anaconda无法创建虚拟环境问题

    报错信息 base C Users Administrator gt conda create name pytorch Solving environment done gt gt gt gt gt gt gt gt gt gt gt g
  • SpringBoot 通过 Feign 调用Django 接口

    注意 本教程实现的是SpringBoot 调用 Django 中的http接口 调用Django 的接口是为了更好的模拟项目流程 如果只想要理解调用过程 使用springBoot 调用springBoot 会更好 主要使用feign web
  • [Linux]使用CentOS镜像与rpm来安装虚拟机软件

    目录 一 前言 二 步骤 一 连接镜像文件 二 将需要的RPM文件移动到虚拟机上 三 安装rpm软件包 一 前言 本文使用的是CentOS的VM ware虚拟机 二 步骤 一 连接镜像文件 双击虚拟机右下角 打开虚拟机配置菜单 选中蓝圈中选
  • cv2.error: OpenCV(4.5.4) D:\a\opencv-python\opencv-python\opencv\modules\imgproc\src\resize.cpp:4051

    报错信息 cv2 error OpenCV 4 5 4 D a opencv python opencv python opencv modules imgproc src resize cpp 4051 error 215 Asserti
  • sqlserver 时间加减精确到分钟_SQL Server中sp_spaceused统计数据使用的空间总量不正确的原因...

    很多时候 我们经常使用sp spaceused来查看表的空间使用情况 上个月群里有个网友说他使用DELETE删除了数据后 使用sp spaceused查看 发现该表的分配的空间总量 reserved 与数据使用的空间总量 data 没有变化
  • 卸载地平线5所有文件。本人亲测。

    首先你要了解的是 你下载的游戏文件都会保存在windowsapps文件里面 但是删除这个文件我们需要获得权限 下面是讲如何删除这个文件 1 win r 输入 C Program Files WindowsApps 2 在 WindowsAp
  • MATLAB机器人工具箱使用

    MATLAB机器人工具箱 一 前言 在开始做机器人仿真之前 我了解了一系列机器人仿真软件 包括Matlab Webots Gazebo V rep Adams Simbad Morse等 的适用场景 使用方法等资料 决定从最经典的Matla
  • 程序设计之C语言判断满足条件的三位数

    6 6 判断满足条件的三位数 15 分 本题要求实现一个函数 统计给定区间内的三位数中有两位数字相同的完全平方数 如144 676 的个数 函数接口定义 int search int n 其中传入的参数int n是一个三位数的正整数 最高位
  • 超实用的自动化测试平台推荐

    什么是平台 平台就是一种用来实现某种功能的体系 包括各种不同的元素 架构 流程 标准 机制和工具等 而软件测试平台是为客户打造的集高效率 低成本等特性于一身的软件工作空间 它不仅可以大幅缩短软件产品的测试周期 还可以提升产品品质 同时还能充
  • Centos7安装Mysql

    1 添加Mysql Yum Repository rpm Uvh https dev mysql com get mysql80 community release el7 3 noarch rpm 然后查看Mysql包 yum list
  • 如何在 Java 中将 InputStream 读取/转换为字符串?

    问题描述 如果您有一个 java io InputStream 对象 您应该如何处理该对象并生成一个 String 假设我有一个包含文本数据的 InputStream 并且我想将其转换为 String 例如 我可以将其写入日志文件 获取 I
  • 线上排查问题大全

    CPU 一般来讲我们首先会排查cpu方面的问题 cpu异常往往还是比较好定位的 原因包括业务逻辑问题 死循环 频繁gc以及上下文切换过多 而最常见的往往是业务逻辑 或者框架逻辑 导致的 可以使用jstack来分析对应的堆栈情况 使用jsta
  • Vue 3 状态管理进阶:使用 Pinia 构建可扩展的应用程序

    Vue 3 状态管理进阶 使用 Pinia 构建可扩展的应用程序 前言 1 Pinia 简介 2 安装和配置 Pinia 3 创建和使用 Pinia Store 4 在组件中使用 Pinia Store 5 在模板中使用 Pinia Sto
  • JavaWeb通过前端向Mysql数据库中插入数据问题

    作为入门小白 记录下因为基础不扎实而踩得坑 在写注册界面时 需要利用web界面输入数据 idea操作向数据库插入数据 首先确定了数据库正常 tomcat正常运行 sql语句正常 在idea中测试业务层也能正常向数据库中插入数据 但是在web
  • 构造器注入导致的循环依赖问题及解决方案

    构造器注入导致的循环依赖问题及解决方案 目录 概述 实现思路分析 循环依赖 问题 解决方案 方式二 相关工具如下 分析 小结 参考资料和推荐阅读 LD is tigger forever CG are not brothers foreve
  • [疯狂Java]NIO.2:walkFileTree、FileVisitor(遍历文件/目录)

    1 遍历文件和目录 FileVisitor 1 在旧版本中遍历文件系统只能通过递归的方法来实现 但是这种方法不仅消耗资源大而且效率低 2 NIO 2的Files工具类提供了一个静态工具方法walkFileTree来高效并优雅地遍历文件系统