第一百八十一节 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…

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;甚至安排…

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 的首页,持续学…

电脑屏幕录制软件哪个好?推荐3款,满足各种录制需求

大家好&#xff0c;今天和大家来聊一个既实用又有点神秘的话题——电脑屏幕录制软件哪个好&#xff1f;这是个让众多网友头疼的问题&#xff0c;毕竟谁不想拥有一款既好用又好玩的录制神器呢&#xff1f; 首先&#xff0c;我们得明确屏幕录制软件可不是简单地录屏而已&#xf…

VARIAN瓦里安真空Model 979 Leak Detector Instruction Manual使用说明

VARIAN瓦里安真空Model 979 Leak Detector Instruction Manual使用说明

杂项——电阻式角度传感器使用

三个引脚&#xff0c;分别接3.3V&#xff0c;GND&#xff0c;ADC引脚。12位ADC有4096份&#xff0c;将360分成4096份&#xff0c;再乘以单片机返回的模拟量的值&#xff0c;即可得到角度。 M0代码 #include "ti_msp_dl_config.h"volatile bool gCheckADC; volatile …

免费【2024】springboot 毕业生学历证明系统

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

【案例】使用React+redux实现一个Todomvc

About 大家好&#xff0c;我是且陶陶&#xff0c;今天跟大家分享一个redux的todoList案例&#xff0c;通过这个案例能够快速掌握redux的基本知识点&#x1f339; ❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…

微信小程序之计算器

在日常生活中&#xff0c;计算器是人们广泛使用的工具&#xff0c;可以帮助我们快速且方便地计算金额、成本、利润等。下面将会讲解如何开发一个“计算器”微信小程序。 一、开发思路 1、界面和功能 “计算器”微信小程序的页面效果如图所示 在计算器中可以进行整数和小数的…