Java学习笔记:使用File.walkFileTree遍历文件

2023-11-10

这篇文章是对自己学习的一个总结,学习资料是Java1.8官方文档。这篇文章主要是讲如何使用walkFileTree方法,会涉及到部分源码,但是浅尝辄止,主要还是讲如何应用。


方法简介

1.7以前的Java想要遍历指定目录下的所有文件和子目录的话,就只能使用递归的方式。这种方式不仅复杂,灵活性也很差。

但现在不一样了,Files类提供了walkFileTree()方法来灵活遍历文件。walkFileTree()方法有下面两种重载形式。

  1. walkFileTree(Path start, FileVisitor<? super Path> visitor>:遍历start路径下的所有文件和子目录。
  2. walkFileTree(Path start, Set<FileVisitOption> options, int maxDepth, FileVisitor<? super Path> visitor):和上一个方法功能类似,但是它最多遍历到maxDepth深度的文件。

这两个方法中,Path类比较简单,就是一个描述路径的类,这里不多讲。

这两个方法遍历文件的方式是深度遍历。

那么剩下的就是弄清楚FileVisitor,FileVisitOption这两个东西是什么鬼。

 


FileVisitor

点进文档查看这个类的描述(他不是类啊,是个接口)

大致翻译一下,它是文件访问器,它的实现类是walkFileTree()方法的参数。这描述等于啥也没说,我们就是想知道这接口可以干嘛。不过不用慌,接口就是规范,用来规范行为,那它作为文件访问器,那肯定是来规范访问文件时可以有什么操作。我们看看他的抽象方法。

只有这四个抽象方法。根据方法的描述,从上到下,这四个方法分别是定义

  1. 每当访问一个文件夹,访问结束后结束后干些什么?
  2. 每当访问一个文件夹,访问前干些什么?
  3. 每当访问一个文件,访问它时对它具体做什么?比如删除这个文件,复制等。
  4. 每当访问一个文件,如果这个文件是不可访问的话,要怎么办?

看到这里就应该大致对这个接口有了解了。它存在的意义就是我们实现它的抽象方法,在其中定义我们在访问文件时的各种操作。

上面的四个抽象方法有多出来FileVisitResult和BasicFileAttributes这两个陌生的类,这两个类比较简单。

 

 

首先是FileVisitResult。它是一个枚举类。我们在访问某一个文件时,有访问前,可以访问后,访问中,访问失败这四个节点的操作。完成这些节点的操作以后,我们可以让程序不再继续访问剩下的文件,或者不再访问平级的文件,去直接访问子目录等。我们就需要使用FileVisitResult的不同枚举值告诉程序接下来应该怎么做。下面是FileVisitResult的四个枚举值。

分别代表正常访问下个文件;

略过剩下的同级文件,直接访问子目录下的文件;

访问下一个同级文件,不再访问子目录;

立刻终止,停止访问文件

 

至于BasicFileAttributes类,它就是提供了很多方法来获得当前访问文件的各种属性,比如文件的大小,上次修改时间,是否是目录等。所有的方法如下所示,不一一介绍了。

 

现在我们回过去看,就能大致明白如何使用walkFileTree(Path start, FileVisitor<? super Path> visitor>)方法来遍历文件。这里我么来简单实践一下理解更深刻些。

我打算遍历一个文件和这个文件的所有子文件,并且打印出来。读者可自己试试打印效果。要注意,遍历方式是深度遍历,并且隐藏文件也可以遍历到。

Path path = Paths.get("/Users/user/Desktop/test");
FileVisitor<Path> fileVisitor = new FileVisitor<Path>() {
    @Override
    public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
        System.out.println("准备访问文件,准备访问的文件名是" + dir.getFileName() + " 文件大小为" + attrs.size());
        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
        System.out.println("正在访问文件,文件名为" + file.getFileName());
        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
        return null;
    }

    @Override
    public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
        System.out.println(dir.getFileName() + "已访问结束,准备访问下一个文件");
        return FileVisitResult.CONTINUE;
    }
};
Files.walkFileTree(path, fileVisitor);

 

 

为了简化FileVisitor繁杂的操作,Java还提供了一个简单实现了FileVisitor的类SimpleFileVisitor。

SimpleFileVisitor没什么特别之处,它只是简单复写了FileVisitor的四个方法。下面是SimpleFileVisitor的部分代码截图

能看出来,SimpleFileVisitor就是判断一下参数是不是空,为空则抛出异常,不为空就继续遍历。

 

 

 


FileVisitOption

就是一个枚举类,而且只有一个枚举值······搞不懂是怎么用的······

 

 

 

 

 

 

 

 

 

 

 

 

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

Java学习笔记:使用File.walkFileTree遍历文件 的相关文章

  • java类的生命周期

    如图 1 加载 我们编写一个java的源文件 经过编译后生成一个后缀名为 class的文件 这结合四字节码文件 java虚拟机就识别这种文件 java的生命周期就是class文件从加载到消亡的过程 关于加载 其实 就是将源文件的class文
  • 了解java

    目录 一 Java是什么 二 Java语言特性 1 简单性 2 面向对象 3 健壮性 4 多线程 5 可移植性 跨平台 三 Java两种核心机制 1 Java虚拟机 Java Virtal Machine 2 垃圾收集机制 Garbage
  • mysql如何一秒插入10万条数据

    当我们需要批量插入或者更新记录时 可以采用Java的批量更新机制 该机制允许多条语句甚至一次性提交给数据库处理 通常情况下比一句一提交处理更有效率 jdbc处理批量提交有三个方法 需要注意的是 这三种方法都要和PreparedStateme
  • Java特训的第一天——开篇

    我是一名刚入门的Java菜鸟 我选择Java的原因是因为其语法简单 功能强大 从web 到桌面 到嵌入式 无所不能 下面我将谈一谈我对Java语言的认识 Java语言概述 关于Java的介绍网上有很详细的阐述 我在这里就不再细述了 下面只简
  • java数组学习

    2021 2 2 数组 一维数组的使用 1 一维数组的声明和初始化 2 如何调用数组的指定位置的元素 3 如何获取数组的长度 4 如何遍历数组 5 数组元素的默认初始化值 6 数组的内存解析 package day01 import jav
  • 【java基础】 方法,实参和形参,方法的重载,签名,递归

    目录 方法概念及使用 实参和形参的关系 重要 方法的重载 方法签名 简单了解 递归 简单介绍 方法概念及使用 方法就是一个代码片段 类似于 C 语言中的 函数 作用 是能够模块化的组织代码 当代码规模比较复杂的时候 做到代码被重复使用 一份
  • MQ的基本原理是怎样的?MQ的优点有哪些?MQ的核心概念包括哪些?MQ的消息传递模式有哪些?

    1 MQ的基本原理是怎样的 MQ 消息队列 是一种面向消息的中间件 用于实现不同系统之间的异步通信 其基本原理如下 生产者 Producer 将消息发送到消息队列中 而不是直接发送给消费者 Consumer 消息队列将接收到的消息存储在内部
  • javaSE进阶1之static用法

    JavaSE进阶 静态关键字 static static关键字的作用 成员变量分类 静态成员变量 实例成员变量 static修饰成员变量内存原理 static 修饰成员方法的基本用法 成员方法的分类 static修饰成员方法内存原理 sta
  • 【Java】Java中的String类

    文章目录 一 认识 String 类 二 String 类的常用方法 2 1 构造方法 2 2 String 类对象之间的比较 2 3 字符串查找 2 4 字符串的转换 2 5 字符串替换 2 6 字符串拆分 2 7 字符串截取 2 8 字
  • 进制及进制转换详解。原码、反码、移码,补码区别介绍。(通俗易懂)

    目录 前言 一 十进制 n进制 进制转换详解 1 先说说什么是进制 2 二进制介绍 3 十进制 n进制 进制转换详解 重点 十进制 gt n进制 2 8 16 n进制 2 8 16 gt 十进制 非十进制间的互相转化 二 原码 反码 移码
  • java 泛型 作用与定义

    1 泛型方法的定义和使用 public static void main String args throws ClassNotFoundException String str get 哈士奇 world System out print
  • 重试机制的实现(4m,10m,10m,1h,2h,6h,15h)

    项目场景 由于我们现在所做的项目有有很多的外放接口供代理商调用 但是有些接口的响应并不是实时返回的 此时我们就需要使用回调接口的方式 将信息响应给代理商 在这期间可能会出网络不稳定等其他情况 导致回调接口调用失败 所以需要特定的回调重试机制
  • FastJson 之 List<Map>转化成对应List<Object>

    List
  • MVC模型图

    MVC图
  • jeecgboot问题解决方案

    常见问题Q A JEECG老版在线文档 点击进入 1 后台访问提示token错误 报错截图 解决方案 JeecgBoot后台的所有请求访问 增加了token机制 所以不能直接访问后台 而需要通过前台登录才能访问 默认前台访问地址 http
  • 求一个数组的最大值最小值及其下标

    求一个数组的最大值最小值及其下标 思路 假定一个数为最大值 如果有个数比假定的最大值还大 那么该数就为最大值 最小值同理 使用for循环 public class MaxMin public static void main String
  • 关于svn如何上传一个完整的项目

    注意 请一定要按照该步骤进行操作 请上传新项目时将项目名称进行规范命名 例如原始文件是arrange v2 将此项目需要注入新的医院 则命名为 arrange 某医院名称 门诊或者医技或者药房 v2 重新命名文件夹名称快捷键 F12 一 先
  • java连接oracle出现ORA-12505错误

    问题 sqlplus可以连接 但java连接报错 ORA 12505 ORA 12505 TNS listener does not currently know of SID given in connect descr 解析 原因 数据
  • mysql无法连接问题及其环境变量配置

    问题 Can t connect to MySQL server on localhost 3306 10061 方案一 不推荐 第一 在环境变量 系统变量的path中添加mysql的bin目录 我的是D mysql mysql 8 0 2
  • 黑豹程序员-字符串中查找出重复的字符串

    Collections frequency codeList element 字符串element 在codeList集合中重复的次数 List

随机推荐