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,一经查实,立即删除!

相关文章

Git中Update和Pull的区别

在本文中&#xff0c;我们将介绍Git中的两个操作——”Update”和”Pull”&#xff0c;并解释它们之间的区别。 1、“Update”的含义和用法 “Update”是Git中用于更新本地仓库和工作区的操作。它的作用是将远程仓库中的最新变更同步到本地。当我们执行”Update”操作时&…

(二十)、从宿主机访问 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、宿主机…

Apache 出现 “403 forbidden“ 排查方法

1、检查运行 Apache 进程的用户没有对目录具备读取权限 如果该用户没有对 Directory 指定的目录具备适当的读取权限&#xff0c;就会导致 403 错误。 ​​例如&#xff1a;使用用户apache启动Apache进程&#xff0c;但是apache用户对 Directory 指定的目录没有读取权限 2、检查…

k8s的部署和安装

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

Python基础09_类和对象(下)迭代器和生成器函数式编程

一、类和对象(下) 1、封装 封装是指隐藏类的实现细节&#xff0c;让使用者不用关心这些细节; 封装的目的是让使用者通过尽可能少的方法(或属性)操作对象 Python的封装是假的&#xff08;模拟的&#xff09;封装 私有属性和方法 python类中以双下划线(__)开头&#xff0c;不…

AI 通俗理解强人工智能和弱人工智能

强人工智能&#xff08;Strong AI&#xff09;和弱人工智能&#xff08;Weak AI&#xff09;是两种不同类型的人工智能系统&#xff0c;它们的目标、能力和应用范围有很大的区别。 生活化例子 想象你有两个助手&#xff1a; 弱人工智能助手&#xff1a;你让它查资料、翻译、…

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;…

Leetcode 347 Top K Frequent Elements

题意&#xff1a; 求前k个出现频率最高的元素 首先得到一个频率图这是肯定的&#xff0c;下一步要考虑建立一个堆&#xff0c;堆中保存着前k个频率最大的数字&#xff0c;这个怎么做&#xff0c;可以用customized cmp来做&#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 地方数据保护法规 二、…

KClass-关于kotlin中的反射

override val responseType: KClass<SetOperationModeResponse> SetOperationModeResponse::class,这段代码的含义&#xff1a; responseType 是一个只读属性&#xff08;val&#xff09;&#xff0c;它的类型是 KClass<SetOperationModeResponse>。KClass<T&…

深入解析缓存技术

文章目录 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&…