第一百八十一节 Java IO教程 - Java文件树

Java IO教程 - Java文件树

FileVisitor API可以递归地处理文件树中的所有文件和目录。

当我们要对文件树中的所有或某些文件或目录执行某些操作时,FileVisitor API非常有用。

SimpleFileVisitor类是FileVisitor接口的基本实现。

当访问文件/目录时,SimpleFileVisitor类不执行任何操作。我们可以从SimpleFileVisitor类继承我们的文件访问类,并且只覆盖适合我们需要的方法。

FileVisitor接口的方法:

ID含义
1FileVisitResult preVisitDirectory(T dir,BasicFileAttributes attrs) 在访问目录中的条目之前调用一次。
2FileVisitResult postVisitDirectory(T dir,IOException exc) 已访问目录中的后调用项。如果在目录的迭代期间抛出了任何异常,则将异常对象作为第二个参数传递给此方法。如果此方法的第二个参数为null,则在目录迭代期间没有异常。
3FileVisitResult visitFile(T文件,BasicFileAttributes attrs) 当访问目录中的文件时调用。
4FileVisitResult visitFileFailed(T文件,IOException exc) 当由于任何原因而无法访问文件或目录时调用。

下表列出了FileVisitResult的枚举常量及其说明

枚举常量描述
CONTINUE继续处理
SKIP_SIBLINGS继续处理而不访问文件或目录的兄弟节点。
SKIP_SUBTREE继续处理,而不访问目录中的条目。
TERMINATE终止文件访问过程。

我们不需要在我们的文件访问类的所有四个方法中编写逻辑。要复制目录,请使用preVisitDirectory()方法来创建一个新目录和visitFile()方法来复制文件。

以下代码显示如何打印目录的子目录和文件的名称。

import static java.nio.file.FileVisitResult.CONTINUE;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.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;public class Main {public static void main(String[] args) {Path startDir = Paths.get("");FileVisitor<Path> visitor = getFileVisitor();try {Files.walkFileTree(startDir, visitor);} catch (IOException e) {e.printStackTrace();}}public static FileVisitor<Path> getFileVisitor() {class DirVisitor<Path> extends SimpleFileVisitor<Path> {@Overridepublic FileVisitResult preVisitDirectory(Path dir,BasicFileAttributes attrs) {System.out.format("%s [Directory]%n", dir);return CONTINUE;}@Overridepublic FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {System.out.format("%s [File,  Size: %s  bytes]%n", file, attrs.size());return CONTINUE;}}FileVisitor<Path> visitor = new DirVisitor<>();return visitor;}
}

上面的代码生成以下结果。

例子

以下代码显示如何使用FileVisitor API删除目录树。

import static java.nio.file.FileVisitResult.CONTINUE;
import static java.nio.file.FileVisitResult.TERMINATE;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.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;public class Main {public static void main(String[] args) {Path dirToDelete = Paths.get("DIR");FileVisitor<Path> visitor = getFileVisitor();try {Files.walkFileTree(dirToDelete, visitor);}catch (IOException e) {System.out.println(e.getMessage());}}public static FileVisitor<Path> getFileVisitor() {class DeleteDirVisitor extends SimpleFileVisitor<Path> {@Overridepublic FileVisitResult postVisitDirectory(Path dir, IOException e)throws IOException {FileVisitResult result = CONTINUE;if (e != null) {System.out.format("Error deleting  %s.  %s%n", dir, e.getMessage());result = TERMINATE;} else {Files.delete(dir);System.out.format("Deleted directory  %s%n", dir);}return result;}@Overridepublic FileVisitResult visitFile(Path file, BasicFileAttributes attrs)throws IOException {Files.delete(file);System.out.format("Deleted file %s%n", file);return CONTINUE;}}FileVisitor<Path> visitor = new DeleteDirVisitor();return visitor;}
}

上面的代码生成以下结果。

例2

以下代码显示如何使用walkFileTree()方法跟随符号链接。

import java.nio.file.FileVisitOption;
import java.nio.file.FileVisitor;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.EnumSet;
import java.util.Set;
import static  java.nio.file.FileVisitOption.FOLLOW_LINKS;
public class Main {public static void main(String[] args) throws Exception {Path startDir = Paths.get("");FileVisitor<Path> visitor = create your visitor;Set<FileVisitOption> options = EnumSet.of(FOLLOW_LINKS);int depth = Integer.MAX_VALUE;Files.walkFileTree(startDir, options, depth, visitor);}
}

模式匹配

我们可以使用glob和正则表达式模式对字符串形式的Path对象执行模式匹配。

功能接口PathMatcher用于执行匹配。它包含一个方法matches(Path path)方法,如果指定的路径匹配模式,则该方法返回true。

模式字符串由两部分组成,语法和模式由冒号分隔:

syntax:pattern

语法的值是glob或regex。模式部分遵循取决于语法部分的值的语法。

glob模式使用以下语法规则:

  • * 匹配零个或多个字符,而不会交叉目录边界。
  • ** 匹配零个或多个字符跨目录边界。
  • ? 只匹配一个字符。
  • \ 转义以下字符的特殊含义。
  • \\ 匹配单个反斜杠。
  • \* 匹配星号。

放在括号 [] 中的字符称为括号表达式,它匹配单字符。[aeiou]匹配a,e,i,o或u。

两个字符之间的破折号指定范围。[a-z]匹配a和z之间的所有字母。

左括号后的感叹号(!)被视为否定。[!abc]匹配除a,b和c之外的所有字符。

通过在大括号({})中指定逗号分隔的子模式来使用一组子模式。例如,{txt,java,doc}匹配txt,java和doc。

路径的根组件的匹配是实现相关的。

以下代码显示了如何使用PathMatcher对象将路径与glob模式匹配。

import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.PathMatcher;
import java.nio.file.Paths;public class Main {public static void main(String[] args) {String globPattern = "glob:**txt";PathMatcher matcher = FileSystems.getDefault().getPathMatcher(globPattern);Path path = Paths.get("C:\\Java_Dev\\test1.txt");boolean matched = matcher.matches(path);System.out.format("%s matches  %s:  %b%n", globPattern, path, matched);}
}

上面的代码生成以下结果。

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

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

相关文章

React Native在移动端落地实践

在移动互联网产品迅猛发展的今天&#xff0c;技术的不断创新使得企业越来越注重降低成本、提升效率。为了在有限的开发资源下迅速推出高质量、用户体验好的产品&#xff0c;以实现公司发展&#xff0c;业界催生了许多移动端跨平台解决方案。这些方案不仅简化了开发流程&#xf…

速盾:网络安全和 CDN 之间的关系是怎样的?

网络安全和内容交付网络&#xff08;CDN&#xff09;之间有着密切的关系。网络安全主要涉及保护网络和系统免受各种威胁和攻击&#xff0c;而CDN是一种用于提供更快速、高效和可靠的内容交付服务的技术。在当今数字化和云计算时代&#xff0c;网络安全和CDN之间的关系变得更加紧…

zookeeper开启SASL权限认证

目录 一、SASL介绍 二、使用 SASL 进行身份验证 2.1 服务器到服务器的身份验证 2.2 客户端到服务器身份验证 三、验证功能 一、SASL介绍 默认情况下&#xff0c;ZooKeeper 不使用任何形式的身份验证并允许匿名连接。但是&#xff0c;它支持 Java 身份验证与授权服务(JAAS)…

景联文科技入选艾瑞咨询《2024年中国AI基础数据服务产业图谱》

2024年7月&#xff0c;国内领先的数据服务提供商景联文科技&#xff0c;成功入选艾瑞咨询发布的《2024年中国AI基础数据服务产业图谱》&#xff0c;这一荣誉不仅是对景联文科技在AI数据服务领域卓越成就的认可&#xff0c;也是对公司在未来发展中持续引领行业创新的高度期待。 …

FastAPI(七十七)实战开发《在线课程学习系统》接口开发-- 课程编辑和查看评论

源码见&#xff1a;"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 课程编辑 先来看下课程编辑 1.判断是否登录 2.判断课程是否存在 3.是否有权限&#xff08;只有自己可以修改自己的课程&#xff09; 4.名称是否重复…

Docusaurus VS VuePress:哪一个更适合你的技术文档?

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

Tensorflow2.0全套学习(持续更新中)

0 简介 1.学习目标 两大核心模块&#xff1a;深度学习经典算法与Tensorflow项目实战 从零开始&#xff0c;详细的网络模型架构与框架实现方法 2.tensorflow&#xff1a;核心开源库&#xff0c;深度学习框架&#xff0c;帮助开发和训练机器学习模型 3.版本2比1有哪些优势 …

数据库开发:MySQL基础(二)

MySQL基础&#xff08;二&#xff09; 一、表的关联关系 在关系型数据库中&#xff0c;表之间可以通过关联关系进行连接和查询。关联关系是指两个或多个表之间的关系&#xff0c;通过共享相同的列或键来建立连接。常见的关联关系有三种类型&#xff1a;一对多关系&#xff0c;…

2024年7月25日(Git gitlab以及分支管理 )

分布式版本控制系统 一、Git概述 Git 是一种分布式版本控制系统,用于跟踪和管理代码的变更。它是由Linus Torvalds创建的,最 初被设计用于Linux内核的开发。Git允许开发人员跟踪和管理代码的版本,并且可以在不同的开 发人员之间进行协作。 Github 用的就是Git系统来管理它们的…

安卓嘀嗒清单v7.2.2.2高级版

软件介绍 TickTick是一款轻便高效的任务管理、日程管理&#xff08;GTD&#xff09;和时间管理应用&#xff0c;配备强大的记事和提醒功能。你可以在手机、平板、网页等多达11个平台上使用滴答清单记录大小事务、制定工作计划、整理购物清单、设置生日提醒&#xff0c;甚至安排…

react ant Input defaultValue={value}设置了value值以后,但是defalult没有赋值上,输入框也没有显示

在 React 中&#xff0c;defaultValue 是一个非受控属性&#xff0c;而 value 是一个受控属性。这两个属性都可以用于设置 Input 组件的值&#xff0c;但是它们的工作方式有所不同。 value&#xff1a;这是一个受控属性&#xff0c;意味着输入框的值由 React 状态控制。每当状态…

DjangoRF实战-2-apps-users

1、用户模块 创建一个用户模块子应用&#xff0c;用来管理用户&#xff0c;和认证和授权。 1.1根目录创建apps&#xff0c; 为了使用方便&#xff0c;还需要再pycharm中设置一下资源路径&#xff0c;就可以自动提示 1.2注册子应用 1.3添加应用根目录到环境变量path python导…

AI绘画美女图如何带货? 分享最容易的起号方式,一定别错过!!

学习AI绘画最好的工具有两种。 一个是Midjourney&#xff0c;新手只需要知道提示词怎么写就可以了。 不懂得写&#xff0c;就直接去抄&#xff0c;去复制粘贴&#xff0c;AI绘画最值得鼓励的就是抄。 先学会抄&#xff0c;再考虑改&#xff0c;国外有很多设计师赚钱的方式就…

SpringBoot框架简单整合ShardingSphere-JDBC实现MySQL分库分表和读写分离及加密混合

1. 主从配置 1.1 主机1&#xff08;IP:192.168.186.77&#xff09; 1.1.1 docker-compose.yml version: 3.8services:mysql-master:image: mysql:latestcontainer_name: mysql-masterenvironment:MYSQL_ROOT_PASSWORD: 123456MYSQL_USER: masterMYSQL_PASSWORD: 123456MYSQL…

堆的基本实现

一、堆的概念 在提出堆的概念之前&#xff0c;首先要了解二叉树的基本概念 一颗二叉树是节点的有限集合&#xff0c;该集合&#xff1a; 1、或者为空&#xff1b; 2、或者由一个根节点加上两颗分别称为左子树和右子树的两颗子树构成&#xff1b; 堆就是一颗完全二叉树&…

【Python系列】isin用法

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

PCDN技术对运营商有哪些优势?

PCDN技术对运营商有以下几个优势: 1.降低运营成本: PCDN技术利用用户设备作为缓存节点&#xff0c;扩展了分发网络的能力&#xff0c;降低了对高成本服务器和带宽的需求。通过利用低成本的服务器和用户设备进行内容分发&#xff0c;运营商可以大幅降低运营成本&#xff0c;提…

oracle rman参数配置

查看rman参数(rman参数记录于目标库的控制文件中) rman>show all; RMAN> show all;using target database control file instead of recovery catalog RMAN configuration parameters for database with db_unique_name VICDB are: CONFIGURE RETENTION POLICY TO REDUN…

Android中常用哪一种单例

在Android开发中&#xff0c;静态内部类&#xff08;Initialization-on-demand holder idiom&#xff09;和枚举单例&#xff08;Enum Singleton&#xff09;是最常用的单例实现方式。这是因为它们在保证线程安全的同时具有良好的性能和简洁的代码实现。以下是详细的解释&#…

从零开始:软件测试小白快速入门指南

大家好&#xff0c;今天我们将带你走进软件测试的世界&#xff0c;无论你是刚刚踏入这个行业的新手&#xff0c;还是对软件测试充满好奇的观察者&#xff0c;这篇文章都将是你了解和学习软件测试的绝佳起点。让我们一起从最基础的知识开始&#xff0c;逐步揭开软件测试的神秘面…