Java的walkFileTree方法用法【FileVisitor接口】

在Java旧版本中遍历文件系统只能通过File类通过递归来实现,但是这种方法不仅消耗资源大而且效率低。
NIO.2的Files工具类提供了两个静态工具方法walk()和walkFileTree()可用来高效并优雅地遍历文件系统。walkFileTree()功能更强,可自定义实现更多功能:遍历目录文件、拷贝目录文件、移动目录文件和删除目录文件;也可按模式匹配查询文件。

一、walk()方法原型:
Stream java.nio.file.Files.walk(Path start, int maxDepth, FileVisitOption… options) throws IOException
方法的三个参数:
start:表示要遍历的根目录的路径。
maxDepth:表示要遍历的最大深度。如果maxDepth为0,则只遍历根目录,不遍历其子目录。如果maxDepth为正整数,则遍历根目录和所有深度不超过maxDepth的子目录。如果maxDepth为负数,则遍历根目录和所有子目录。
options:表示遍历选项。可选项包括FileVisitOption.FOLLOW_LINKS和FileVisitOption.NOFOLLOW_LINKS。
如果选择FOLLOW_LINKS选项,则遍历符号链接指向的目录;
如果选择NOFOLLOW_LINKS选项,则遍历符号链接本身。

Files.walk()方法应用实例 使用walk()方法编写的遍历文件和目录例程,简洁明了

package nio;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class WalkDemo {public static void printFileTreeWithWalk(String rootPath) throws IOException {Path start = Paths.get(rootPath);int maxDepth = Integer.MAX_VALUE;try {Files.walk(start, maxDepth).forEach(System.out::println);} catch (IOException e) {throw new RuntimeException(e);}}public static void main(String[] args) throws IOException {String rootPath = "D:/src";printFileTreeWithWalk(rootPath);}
}

二、walkFileTree()方法原型:
static Path Files.walkFileTree(Path start, FileVisitor<? super Path> visitor) throws IOException
参数:其中的start表示一个目录,开始遍历文件系统的起点;
其中的visitor是遍历过程中的行为控制器,它是FileVisitor 接口的实现类;

FileVisitor 接口
此接口的主要方法:

  • postVisitDirectory(T dir, IOException exc) 访问目录后,这里可做收尾处理
  • preVisitDirectory(T dir, BasicFileAttributes attrs) 访问目录前,这里可做初化处理
  • visitFile(T file, BasicFileAttributes attrs) 访问文件或目录时进行的操作
  • visitFileFailed(T file, IOException exc) 在试图访问文件或目录,发生错误时善后处理。例如:没有权限打开目录;

上面的方法用到了两个类介绍
1,FileVisitResult 类: 它是一个枚举类。枚举类定义了在访问某一个目录文件时,有访问前、访问后、访问中和访问失败这四个节点的操作策略。
FileVisitor 接口的内部枚举类FileVisitResult 类定义的(访问策略)常量:

  • CONTINUE   继续访问一下一个文件
  • SKIP_SIBLINGS  继续访问,但是不再访问这个目录下的任何项了
  • SKIP_SUBTREE   继续访问,但是不再访问这个文件的兄弟文件(和该文件在同一目录下的文件)
  • TERMINATE   终止访问
    当有任何异常抛出时,就会终止访问,而这个异常就会从walkFileTree方法中抛出。

2,BasicFileAttributes类: 基本文件属性类BasicFileAttributes类, 描述了文件的通用属性,它提供了很多方法来获得当前访问文件的各种属性,比如文件的大小,上次修改时间,是否是目录等:
FileTime creationTime() 创建时间
FileTime lastAccessTime() 最后一次访问时间
FileTime lastModifiedTime() 最后一次编辑时间
boolean isRegularFile() 是常规文件
boolean isDirectory() 是目录文件
boolean isSymoblicLink() 是符号链接
boolean isOther() 上面三种类型都不是
long size() 文件长度
Object fileKey() 返回文件唯一标识

通过读取文件属性对象可以获取文件的各种属性信息(直接使用Files类的一些方法也可以获取或设置部分属性信息)。
  BasicFileAttributes接口描述了文件的通用属性(FileTime类型的创建/最后一次访问/最后一次修改时间,常规文件/目录/符号链接,文件大小,文件主键标识),通用属性获取方式为: BasicFileAttributes attributes=Files.readAttributes(path, BasicFileAttributes.class);

SimpleFileVisitor是FileVisitor 接口的实现类
为了简化FileVisitor繁杂操作的编写工作量,Java NIO库还提供了一个实现了FileVisitor接口的实现类SimpleFileVisitor。SimpleFileVisitor提供了文件树遍历的简单实现,SimpleFileVisitor就是判断一下参数是不是空,为空则抛出异常,不为空就继续遍历。
可以通过继承 SimpleFileVisitor 并重写其中的方法,自定义遍历文件和目录时的操作。
实际使用时,常用继承自SimpleFileVisitor,因为只需要实现你感兴趣的方法即可,无需4个方法全部都覆盖实现。

Files.walkFileTree()方法应用实例
(一)、使用walkFileTree()方法编写的遍历文件和目录例程,使用FileVisitor接口的匿名类。

package nio;
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.FileVisitor;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;
public class WalkFileTreeDemo {public static void printFileTree(String rootPath) throws IOException {Path path = Paths.get(rootPath);if (Files.notExists(path)) {String msg = "目录不存在:"+rootPath;System.out.println(msg);return;}Files.walkFileTree(path, new FileVisitor<Path>() {@Overridepublic FileVisitResult visitFile(Path path, BasicFileAttributes arg1) throws IOException {System.out.println(path.toString());return FileVisitResult.CONTINUE;}@Overridepublic FileVisitResult postVisitDirectory(Path arg0, IOException arg1) throws IOException {System.out.println("访问目录"+ arg0.toString()+"后,可做收尾处理" );return FileVisitResult.CONTINUE;}@Overridepublic FileVisitResult preVisitDirectory(Path arg0, BasicFileAttributes arg1) throws IOException {System.out.println("访问目录" + arg0.toString()+"前,可做初始化处理");return FileVisitResult.CONTINUE;}@Overridepublic FileVisitResult visitFileFailed(Path arg0, IOException arg1) throws IOException {return FileVisitResult.CONTINUE;}});}public static void main(String[] args) throws Exception {String rootPath = "D:/src";printFileTree(rootPath);}
}

上面两个例程实现相同的目录遍历功能,都可遍历子目录信息,两种测试结果如下:(为了便于比较,放同一图上)
在这里插入图片描述

二、使用walkFileTree()方法实现文件检索功能的例程

例程使用了正则表达式作为匹配参数,使程序更加灵活。

package nio;
/**** @author QiuGen* @description  WalkFileTree使用实例,* 实现功能:正则表达式实现文件访问控制器* 1,在目录树中根据正则表达式查找文件;* 2,递归删除目录树中的文件夹(代码在下一节)* @date 2024/10/18* ***/
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.regex.Pattern;
public class WalkFileTreeTest {public static void queryFileTree(String path,String regex) throws IOException {Path start = Paths.get(path);try {Files.walkFileTree(start, new QueryFileVisitor(regex));} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) throws IOException {String path = "D:/src";String regex = ".*\\.mp3";// "大约.*\\.mp3";WalkFileTreeTest.queryFileTree(path,regex);}
}class QueryFileVisitor extends SimpleFileVisitor<Path> {private Pattern pattern;public QueryFileVisitor(String regex) {pattern = Pattern.compile(regex);}@Overridepublic FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {String filePath = file.toAbsolutePath().toString();String name = file.getFileName().toString();//if(filePath.endsWith("test1.txt")){ if(pattern.matcher(name).matches()){System.out.println("找到路径:" + filePath);return FileVisitResult.CONTINUE;}return super.visitFile(file, attrs);}
}

文件检索功能的例程的测试效果图:
在这里插入图片描述

三、使用walkFileTree递归删除目录的例程
walkFileTree还可以用来递归删除目录及其目录中所有文件,Files.delete()只能删除空目录或者文件,当目中包含文件的时候无法直接删除,只能删除目录下所有文件后才能删除目录,walkFileTree可以在isitFile()方法中删除文件,然后在postVisitDirectory()删除目录实现递归删除目录。
递归删除目录树中的文件夹例程:

	/***2,递归删除目录树中的文件夹的功能***/public static void delFilePath(String path) {Path start = Paths.get(path);try {Files.walkFileTree(start, new SimpleFileVisitor<Path>(){@Overridepublic FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {System.out.println("删除文件:" + file);Files.delete(file);return FileVisitResult.CONTINUE;}@Overridepublic FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {System.out.println("删除目录:" + dir);Files.delete(dir);return FileVisitResult.CONTINUE;}});} catch (IOException e) {e.printStackTrace();}}

调用方式:

		String path =  "D:/src/tmp";WalkFileTreeTest.delFilePath(path);

例程测试效果图:
在这里插入图片描述

四、使用walkFileTree()方法编写的目录拷贝例程: 复制目录包括子目录中内容

package nio;
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
public class DirCopyDemo {	// 复制目录:复制目录包括子目录中内容public static void main(String[] args) throws IOException {Path sourceDirPath = Paths.get("D:/src");Path targetDirPath = Paths.get("D:/temp/test");try {Files.walkFileTree(sourceDirPath, new CopyFileVisitor(sourceDirPath, targetDirPath));System.out.println("目录复制成功");} catch (IOException e) {System.out.println("目录复制失败:" + e.getMessage());}}
}
/***定制CopyFileVisitor***/
class CopyFileVisitor extends SimpleFileVisitor<Path> {private final Path sourceDir;private final Path targetDir;public CopyFileVisitor(Path sourceDir, Path targetDir) {this.sourceDir = sourceDir;this.targetDir = targetDir;}@Overridepublic FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {Path targetPath = targetDir.resolve(sourceDir.relativize(dir));try {Files.copy(dir, targetPath);} catch (FileAlreadyExistsException e) {if (!Files.isDirectory(targetPath)) {throw e;}}return FileVisitResult.CONTINUE;}@Overridepublic FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {Path targetPath = targetDir.resolve(sourceDir.relativize(file));Files.copy(file, targetPath, StandardCopyOption.REPLACE_EXISTING);return FileVisitResult.CONTINUE;}
}

参考文献资料:

  • 【脚本之家】Java Files和Paths的使用demo详解
  • 【CSDN】Files类的walkFileTree方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/55782.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(二十)、从宿主机访问 k8s(minikube) 发布的 redis 服务

文章目录 1、环境准备2、具体操作2.1、启动 minikube (start/stop)2.2、准备 redis-deployment.yaml2.3、执行 redis-deployment.yaml2.3.1、查看 pod 信息和日志 2.4、检查部署和服务状态2.4.1、如果需要删除 3、查看 IP 的几个命令3.1、查看IP的几个命令3.2、解读3.3、宿主机…

k8s的部署和安装

k8s的部署和安装 一、Kubernets简介及部署方法 1.1 应用部署方式演变 在部署应用程序的方式上&#xff0c;主要经历了三个阶段&#xff1a; 传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上 优点&#xff1a;简单&#xff0c;不需要其它技术的参…

HarmonyOS Next模拟器异常问题及解决方法

1、问题1&#xff1a;Failed to get the device apiVersion. 解决方法&#xff1a;关闭模拟器清除用户数据重启

电子商务网站维护技巧:保持WordPress、主题和插件的更新

在这个快节奏的数字时代&#xff0c;维护一个电子商务网站的首要任务之一是保持WordPress、主题和插件的最新状态。过时的软件不仅可能导致功能故障&#xff0c;还可能带来安全风险。本文将深入探讨如何有效地更新和维护您的WordPress网站&#xff0c;以确保其安全性和性能。 …

【天池比赛】【零基础入门金融风控 Task2赛题理解】【2.3.6】

【天池比赛】【零基础入门金融风控 Task2赛题理解】【2.3.1-2.3.5】 2.3.6 变量分布可视化 2.3.6.1 单一变量分布可视化 对于 pandas.core.series.Series 类型的变量&#xff1a; index&#xff1a;含义&#xff1a;它表示 Series 对象的索引&#xff0c;也就是每个数据点对…

Docker-Consul概述以及集群环境搭建

文章目录 一、Docker consul概述二、consul 部署1.consul服务器2.registrator服务器&#xff08;客户端&#xff09;2.consul-template&#xff08;在consul服务器&#xff09;3.consul 多节点 一、Docker consul概述 容器服务更新与发现&#xff1a;先发现再更新&#xff0c;…

FFmpeg 4.3 音视频-多路H265监控录放C++开发三 :安装QT5.14.2, 并将QT集成 到 VS2019中。

一&#xff0c;安装QT&#xff0c; 重点&#xff1a;在安装QT的时候要安装msvc201x版本的组件&#xff0c; 二 &#xff0c; 安装 qt-vs-tools Index of /development_releases/vsaddin/2.8.1 三&#xff0c;需要安装过 windows10 SDK&#xff0c;一般我们在安装vs2019的时候就…

【MR开发】在Pico设备上接入MRTK3(三)——在Unity中运行MRTK示例

在前面的文档中&#xff0c;介绍了如何在Unity工程中配置号MRTK和Pico SDK 【MR开发】在Pico设备上接入MRTK3&#xff08;一&#xff09;在Unity中导入MRTK3依赖【MR开发】在Pico设备上接入MRTK3&#xff08;二&#xff09;在Unity中配置Pico SDK 本文将介绍如何运行一个简单…

Docker 安装sql server 登陆失败

错误&#xff1a; Sqlcmd: Error: Microsoft ODBC Driver 18 for SQL Server : SSL Provider: [error:0A000086:SSL routines::certificate verify failed:self-signed certificate]. Sqlcmd: Error: Microsoft ODBC Driver 18 for SQL Server : Client unable to establish co…

【virtuoso】sp测电阻

电路测量原理&#xff1a; 1. 电路原理图 2. 仿真设置 点击select&#xff0c;在原理图选择port设置sp扫频范围 3. plot图像 3.1 plot电阻图像 由公式可得&#xff0c;电阻值为阻抗的实部&#xff0c;所以 1. 选择 ZP 2. 绘制real 3. 点击Z11 4. 即可看到电阻值 3.2 plot电容图…

C++第七讲:STL--list的使用及模拟实现

C第七讲&#xff1a;STL--list的使用及模拟实现 1.list的使用1.1list是什么1.2构造、析构、赋值运算符重载1.3迭代器1.4empty、size、max_size1.5front、back1.6assign -- 代替1.7push_back和emplace_back1.8emplace1.9insert、erase、swap、resize、clear1.10find1.11splice1.…

CSDN Markdown 编辑器语法大全

Markdown 是一种轻量级标记语言&#xff0c;它以简洁、易读易写的特点&#xff0c;被广泛应用于技术文档、博客文章、笔记等领域。CSDN 的 Markdown 编辑器为用户提供了丰富的功能&#xff0c;让用户能够轻松地创建格式规范、内容丰富的文档。以下是一份详细的 CSDN Markdown 编…

大数据治理--法规遵从与隐私保护

目录 ​编辑一、国际及地方数据保护法规 1.1 国际数据保护法规 1.1.1 欧盟《通用数据保护条例》&#xff08;GDPR&#xff09; 1.1.2 美国《加州消费者隐私法案》&#xff08;CCPA&#xff09; 1.1.3 中国《网络安全法》及《个人信息保护法》 1.2 地方数据保护法规 二、…

深入解析缓存技术

文章目录 1. 缓存基本原理2. 缓存更新机制2.1 Cache Aside模式2.2 Read/Write Through2.3 Write Behind Caching2.4 对比总结 3. 缓存数据过期策略3.1 最近最少使用&#xff08;Least Recently Used, LRU&#xff09;算法3.2 先进先出&#xff08;First-In-First-Out, FIFO&…

OpenCV高级图形用户界面(10)创建一个新的窗口函数namedWindow()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 创建一个窗口。 函数 namedWindow 创建一个可以作为图像和跟踪条占位符的窗口。创建的窗口通过它们的名字来引用。 如果已经存在同名的窗口&am…

linux线程 | 全面理解同步与互斥 | 同步

前言&#xff1a;本节内容主要讲解linux下的同步问题。 同步问题是保证数据安全的情况下&#xff0c;让我们的线程访问具有一定的顺序性。 线程安全就规定了它必须是在加锁的场景下的&#xff01;&#xff01;那么&#xff0c; 具体什么是同步问题&#xff0c; 我们加下来看看吧…

lesson01 Backtrader是什么

[Backtrader]专题连载 Backtrader是什么&#xff1f; Backtrader 是 2015 年开源的 Python 量化回测框架&#xff08;支持实盘交易&#xff09;。专注于为量化交易策略提供回测和实盘交易功能。它允许用户集中精力编写可复用的交易策略、指标和分析工具&#xff0c;而无需花费…

衡石分析平台系统分析人员手册-可视化报表仪表盘

仪表盘​ 仪表盘是数据分析最终展现形式&#xff0c;是数据分析的终极展现。 应用由一个或多个仪表盘展示&#xff0c;多个仪表盘之间有业务关联。 仪表盘编辑​ 图表列表​ 打开仪表盘后&#xff0c;就会看到该仪表盘中所有的图表。 调整图表布局​ 将鼠标移动到图表上拖动…

能源领域新政策,我们应该关注什么?

近日&#xff0c;国家发展改革委和国家能源局联合发布了《能源重点领域大规模设备更新实施方案》的通知。该方案指出&#xff0c;能源科技领域是大规模设备更新和消费品以旧换新行动实施的关键领域。 《方案》设定了到2027年&#xff0c;能源重点领域设备投资规模较2023年增长2…

CentOS 8 Stream环境下通过yum安装Mysql

1.在Mysql下载页面MySQL :: Download MySQL Community Server页尾 点击 “MD5 checksums and GnuPG signatures” 进入下一页面 2.打开下载yum repo文件页面 (MySQL :: Download MySQL Yum Repository) 3.点击"DownLoad"按钮&#xff0c;打开下载页面&#xff0c; 4.…