Java 文件过滤器FileFilter | 按条件筛选文件
文章目录
- 一、概述
- 1.1 何时会用到文件过滤器
- 1.2 工作流程
- 1.3 常用的接口和类
- 1.4 文件过滤器的作用
- 二、按文件属性过滤
- 2.1 按前缀或后缀过滤文件名
- 2.2 按文件大小过滤
- 三、按文件内容过滤
- 3.1 文本文件过滤器
- 3.1.1 根据关键字过滤文件内容
- 3.1.2 使用正则表达式过滤文件内容
- 3.2 二进制文件过滤器
- 3.2.1 按文件签名或特定字节模式过滤
- 四、文件过滤器链
一、概述
1.1 何时会用到文件过滤器
文件过滤器是在文件处理中起到重要作用的工具,它可以用来筛选文件并根据特定的条件进行过滤。文件过滤器的应用场景广泛,包括但不限于以下几个方面:
文件搜索:在文件搜索过程中,可以使用文件过滤器来指定搜索的文件类型、文件大小、文件修改时间等条件,从而快速定位目标文件。
文件操作:在进行文件操作时,例如复制、移动、删除文件等,可以使用文件过滤器来选择特定的文件进行操作,避免不必要的操作和错误。
文件展示:在文件展示的场景中,例如文件浏览器、文件选择对话框等,可以使用文件过滤器来过滤显示的文件,使用户只看到符合条件的文件。
文件过滤器的重要性在于它可以提高文件处理的效率、准确性和可靠性,同时也提供了更好的用户体验和交互性。
1.2 工作流程
接收文件:文件过滤器首先接收一个文件作为输入。
判断条件:文件过滤器根据指定的条件对文件进行判断。条件可以是文件的类型、文件名、文件大小等。
判断结果:根据判断条件的结果,文件过滤器决定文件是否符合要求。如果文件符合条件,则接受该文件;如果文件不符合条件,则拒绝该文件。
处理结果:根据文件的接受或拒绝结果,文件过滤器可以执行相应的操作。例如,在文件搜索中,可以将符合条件的文件添加到结果列表中。
1.3 常用的接口和类
Java IO库提供了两个主要的文件过滤器接口和相应的实现类,用于实现文件过滤的功能:
java.io.FileFilter接口:
accept(File pathname):返回一个布尔值,表示是否接受指定的文件
java.nio.file.DirectoryStream.Filter接口:
accept(Path entry):返回一个布尔值,表示是否接受指定的文件
java.io.File类:
listFiles(FileFilter filter)和istFiles(FilenameFilter filter):根据文件过滤器筛选文件。
java.nio.file.Files类:
newDirectoryStream(Path dir, DirectoryStream.Filter<? super Path> filter):根据文件过滤器筛选目录中的文件。
1.4 文件过滤器的作用
文件过滤器可以根据文件的属性或内容进行筛选,以满足特定的需求。它可以帮助我们:
根据文件名进行筛选:可以根据文件名的前缀、后缀、通配符等进行筛选。
根据文件类型进行筛选:可以根据文件的扩展名或MIME类型进行筛选。
根据文件大小进行筛选:可以根据文件的大小范围进行筛选。
根据文件内容进行筛选:可以根据文件内容的关键字、正则表达式、文件签名等进行筛选。
二、按文件属性过滤
2.1 按前缀或后缀过滤文件名
根据文件名的特定属性来筛选文件,可以使用通配符进行文件名匹配,也可以按照文件名的前缀或后缀来过滤文件。
下列demo中创建了两个文件名过滤器,一个用于匹配以"test"开头的文件,另一个用于匹配以.txt结尾的文件。然后分别应用这两个过滤器来筛选文件,并输出过滤结果。
import java.io.File;
import java.io.FileFilter;public class FilenameFilterExample {public static void main(String[] args) {// 创建文件名过滤器(匹配以"test"开头的文件)FileFilter prefixFilter = new FileFilter() {@Overridepublic boolean accept(File file) {return file.getName().startsWith("test");}};// 创建文件名过滤器(匹配以".txt"结尾的文件)FileFilter suffixFilter = new FileFilter() {@Overridepublic boolean accept(File file) {return file.getName().endsWith(".txt");}};// 遍历目录并应用文件名过滤器File directory = new File("path/to/directory");// 按前缀过滤文件名File[] prefixFiles = directory.listFiles(prefixFilter);System.out.println("按前缀过滤结果:");for (File file : prefixFiles) {System.out.println(file.getName());}// 按后缀过滤文件名File[] suffixFiles = directory.listFiles(suffixFilter);System.out.println("按后缀过滤结果:");for (File file : suffixFiles) {System.out.println(file.getName());}}
}
2.2 按文件大小过滤
设定一个文件大小的阈值,只选择满足条件的文件。
使用file.length()方法获取文件的大小,并与设定的阈值进行比较,从而筛选出大于1MB的文件。
import java.io.File;
import java.io.FileFilter;public class FileSizeFilterExample {public static void main(String[] args) {// 创建文件大小过滤器(筛选大于1MB的文件)FileFilter filter = new FileFilter() {@Overridepublic boolean accept(File file) {long fileSize = file.length();long threshold = 1024 * 1024; // 1MBreturn fileSize > threshold;}};// 遍历目录并应用文件大小过滤器File directory = new File("path/to/directory");File[] files = directory.listFiles(filter);// 输出过滤结果for (File file : files) {System.out.println(file.getName());}}
}
三、按文件内容过滤
3.1 文本文件过滤器
文本文件过滤器是根据文件的内容来筛选文件的过滤器。可以使用关键字或正则表达式来过滤文本文件的内容。
3.1.1 根据关键字过滤文件内容
可以根据文件中是否包含指定的关键字来进行过滤。
使用contains(keyword)方法来判断文件中是否包含指定的关键字,从而决定是否接受该文件。
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.FileFilter;public class KeywordFilterExample {public static void main(String[] args) {// 创建文本文件过滤器(根据关键字过滤文件内容)FileFilter filter = new FileFilter() {@Overridepublic boolean accept(File file) {String keyword = "example"; // 指定关键字try (BufferedReader reader = new BufferedReader(new FileReader(file))) {String line;while ((line = reader.readLine()) != null) {if (line.contains(keyword)) {return true; // 文件中包含关键字,接受该文件}}} catch (IOException e) {e.printStackTrace();}return false; // 文件中不包含关键字,拒绝该文件}};// 遍历目录并应用文本文件过滤器File directory = new File("path/to/directory");File[] files = directory.listFiles(filter);// 输出过滤结果for (File file : files) {System.out.println(file.getName());}}
}
3.1.2 使用正则表达式过滤文件内容
使用正则表达式过滤文件内容是一种更加灵活的文本文件过滤方式。可以根据正则表达式匹配文件中的内容来进行过滤。
使用Pattern.matches(regex, line)方法来判断文件内容是否匹配指定的正则表达式。
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.FileFilter;
import java.util.regex.Pattern;public class RegexFilterExample {public static void main(String[] args) {// 创建文本文件过滤器(使用正则表达式过滤文件内容)FileFilter filter = new FileFilter() {@Overridepublic boolean accept(File file) {String regex = "\\b\\d{3}-\\d{3}-\\d{4}\\b"; // 指定正则表达式try (BufferedReader reader = new BufferedReader(new FileReader(file))) {String line;while ((line = reader.readLine()) != null) {if (Pattern.matches(regex, line)) {return true; // 文件内容匹配正则表达式,接受该文件}}} catch (IOException e) {e.printStackTrace();}return false; // 文件内容不匹配正则表达式,拒绝该文件}};// 遍历目录并应用文本文件过滤器File directory = new File("path/to/directory");File[] files = directory.listFiles(filter);// 输出过滤结果for (File file : files) {System.out.println(file.getName());}}
}
3.2 二进制文件过滤器
二进制文件过滤器是根据文件的内容进行筛选的过滤器。与文本文件过滤器不同,二进制文件过滤器需要根据文件的签名或特定字节模式来进行过滤。
3.2.1 按文件签名或特定字节模式过滤
二进制文件通常具有特定的文件签名或字节模式,可以根据这些特征来进行过滤。
下列demo中创建了一个二进制文件过滤器,使用文件的签名来判断文件是否为ZIP文件。我们指定了ZIP文件的签名为50 4B 03 04(16进制),然后读取文件的前几个字节并与签名进行比较。
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.FileFilter;public class BinaryFilterExample {public static void main(String[] args) {// 创建二进制文件过滤器(按文件签名或特定字节模式过滤)FileFilter filter = new FileFilter() {@Overridepublic boolean accept(File file) {byte[] signature = {0x50, 0x4B, 0x03, 0x04}; // ZIP 文件的签名try (FileInputStream fis = new FileInputStream(file)) {byte[] buffer = new byte[signature.length];int bytesRead = fis.read(buffer);if (bytesRead == signature.length) {for (int i = 0; i < signature.length; i++) {if (buffer[i] != signature[i]) {return false; // 文件签名不匹配,拒绝该文件}}return true; // 文件签名匹配,接受该文件}} catch (IOException e) {e.printStackTrace();}return false; // 文件读取失败或文件长度不足,拒绝该文件}};// 遍历目录并应用二进制文件过滤器File directory = new File("path/to/directory");File[] files = directory.listFiles(filter);// 输出过滤结果for (File file : files) {System.out.println(file.getName());}}
}
四、文件过滤器链
有时候需要多个文件过滤器,以实现更复杂的文件筛选逻辑。Java提供了java.io.FileFilter接口的另一个实现类java.io.FilenameFilter,它可以用于根据文件名进行过滤。
下面是一个示例代码,演示如何创建文件过滤器链和组合:
import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;public class FileFilterExample {public static void main(String[] args) {// 创建文件名过滤器(根据前缀过滤)FilenameFilter prefixFilter = new FilenameFilter() {@Overridepublic boolean accept(File dir, String name) {String prefix = "example";return name.startsWith(prefix);}};// 创建文件类型过滤器(根据文件类型过滤)FileFilter extensionFilter = new FileFilter() {@Overridepublic boolean accept(File file) {String extension = ".txt";return file.getName().endsWith(extension);}};// 创建文件过滤器链(组合前缀过滤器和类型过滤器)FileFilter filterChain = new FileFilter() {@Overridepublic boolean accept(File file) {return prefixFilter.accept(file.getParentFile(), file.getName()) &&extensionFilter.accept(file);}};// 遍历目录并应用文件过滤器链File directory = new File("path/to/directory");File[] files = directory.listFiles(filterChain);// 输出过滤结果for (File file : files) {System.out.println(file.getName());}}
}
————————————————
版权声明:本文为CSDN博主「夏诗曼CharmaineXia」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/CharmaineXia/article/details/131779980
相关文章:
Java 文件过滤器FileFilter | 按条件筛选文件
文章目录 一、概述1.1 何时会用到文件过滤器1.2 工作流程1.3 常用的接口和类1.4 文件过滤器的作用 二、按文件属性过滤2.1 按前缀或后缀过滤文件名2.2 按文件大小过滤 三、按文件内容过滤3.1 文本文件过滤器3.1.1 根据关键字过滤文件内容3.1.2 使用正则表达式过滤文件内容 3.2 …...
python格式化地址信息
背景 最近在折腾一个好玩的库,capa 实现地址的格式化输出。我看的教程是这样的: location_str ["徐汇区虹漕路461号58号楼5楼", "泉州市洛江区万安塘西工业区"] import cpca df cpca.transform(location_str) df在正式的运行代码…...
k8s1.26.6 安装gitlab
Gitlab官方提供了 Helm 的方式在 Kubernetes 集群中来快速安装,但是在使用的过程中发现 Helm 提供的 Chart 包中有很多其他额外的配置,所以我们这里使用自定义的方式来安装,也就是自己来定义一些资源清单文件。 Gitlab主要涉及到3个应用&…...
C5.0决策树建立个人信用风险评估模型
通过构建自动化的信用评分模型,以在线方式进行即时的信贷审批能够为银行节约很多人工成本。本案例,我们将使用C5.0决策树算法建立一个简单的个人信用风险评估模型。 导入类库 读取数据 #创建编码所用的数据字典 col_dicts{} #要编码的属性集 cols [che…...
【k8s集群部署】使用containerd运行时部署kubernetes集群(V1.27版本)
【k8s集群部署】使用containerd运行时部署kubernetes集群(V1.27版本) 一、本次实践介绍1.1 环境规划介绍1.2 本次实践简介二、三台主机基础环境配置2.1 主机配置工作2.2 关闭防火墙和selinux2.3 关闭swap2.4 清空iptables2.5 配置时间同步2.6 修改内核参数2.7 配置hosts文件三…...
网络安全进阶学习第八课——信息收集
文章目录 一、什么是信息收集?二、信息收集的原则三、信息收集的分类1.主动信息收集2.被动信息收集 四、资产探测1、Whois查询#常用网站: 2、备案信息查询#常用网站: 3、DNS查询#常用网站: 4、子域名收集#常用网站:#常…...
Spring Data Elasticsearch - 在Spring应用中操作Elasticsearch数据库
Spring Data Elasticsearch 文章目录 Spring Data Elasticsearch1. 定义文档映射实体类2. Repository3. ElasticsearchRestTemplate3.1 查询相关特性3.1.1 过滤3.1.2 排序3.1.3 自定义分词器 3.2 高级查询 4. 索引管理4.1 创建索引4.2 检索索引4.3 修改映射4.4 删除索引 5. 异常…...
图论-简明导读
计算机图论是计算机科学中的一个重要分支,它主要研究图的性质和结构,以及如何在计算机上有效地存储、处理和操作这些图。本文将总结计算机图论的核心知识点。 一、基本概念 计算机图论中的基本概念包括图、节点、边等。图是由节点和边构成的数据结构&am…...
记一次 .NET 某物流API系统 CPU爆高分析
一:背景 1. 讲故事 前段时间有位朋友找到我,说他程序CPU直接被打满了,让我帮忙看下怎么回事,截图如下: 看了下是两个相同的程序,既然被打满了那就抓一个 dump 看看到底咋回事。 二:为什么会打…...
【Docker】Docker安装Kibana服务_Docker+Elasticsearch+Kibana
文章目录 1. 什么是Kibana2. Docker安装Kibana2.1. 前提2.2. 安装Kibana 点击跳转:Docker安装MySQL、Redis、RabbitMQ、Elasticsearch、Nacos等常见服务全套(质量有保证,内容详情) 1. 什么是Kibana Kibana 是一款适用于Elasticse…...
前端面试题-VUE
1. 对于MVVM的理解 MVVM 是 Model-View-ViewModel 的缩写Model 代表数据模型,也可以在 Model 中定义数据修改和操作的业务逻辑。View 代表 UI 组件,它负责将数据模型转化成 UI 展现出来。ViewModel 监听模型数据的改变和控制视图⾏为、处理⽤户交互&…...
Linux嵌入式平台安全启动理解介绍
一、意义 安全启动可以防止未授权的或是进行恶意篡改的软件在系统上运行,是系统安全的保护石,每一级的前一个镜像会对该镜像进行校验。 1.1 安全启动原理介绍 通过数字签名进行镜像完整性验证(使用到非对称加密算法和哈希算法) 签名过程: raw_image--->use ha…...
安全学习DAY09_加密逆向,特征识别
算法逆向&加密算法分类,特征识别 文章目录 算法逆向&加密算法分类,特征识别算法概念,分类单向散列加密 - MD5对称加密 - AES非对称加密 - RSA 常见加密算法识别特征,解密特点MD5密文特点BASE64编码特点AES、DES特点RSA密文…...
原型模式(Prototype)
原型模式是一种创建型设计模式,使调用方能够复制已有对象,而又无需使代码依赖它们所属的类。当有一个类的实例(原型),并且想通过复制原型来创建新对象时,通常会使用原型模式。 The Prototype pattern is g…...
深度学习之用PyTorch实现线性回归
代码 # 调用库 import torch# 数据准备 x_data torch.Tensor([[1.0], [2.0], [3.0]]) # 训练集输入值 y_data torch.Tensor([[2.0], [4.0], [6.0]]) # 训练集输出值# 定义线性回归模型 class LinearModel(torch.nn.Module):def __init__(self):super(LinearModel, self)._…...
45.248.11.X服务器防火墙是什么,具有什么作用
防火墙是一种网络安全设备或软件,服务器防火墙的作用主要是在服务器和外部网络之间起到一个安全屏障的作用,保护计算机网络免受未经授权的访问、恶意攻击或不良网络流量的影响,保护服务器免受恶意攻击和非法访问。它具有以下功能:…...
如何以无服务器方式运行 Go 应用程序
Go编程语言一直以来都对构建REST API提供了丰富的支持。这包括一个出色的标准库(net/HTTP),以及许多流行的包,如Gorilla mux、Gin、Negroni、Echo、Fiber等。使用AWS Lambda Go运行时,我们可以使用Go构建AWS Lambda函数…...
小程序商城系统的开发方式及优缺点分析
小程序商城系统是一种新型的电子商务平台,它通过小程序的形式为商家提供了一种全新的销售渠道,同时也为消费者提供了一种便捷的购物体验。小程序商城系统具有低成本、快速上线、易于维护等特点,因此在市场上受到了广泛的关注和应用。这里就小…...
[数据集][目标检测]城市道路井盖破损丢失目标检测1377张
数据集制作单位:未来自主研究中心(FIRC) 数据集格式:Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件,仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数):1377 标注数量(xml文件个数):1377 标注类别数&a…...
【Spring Cloud 三】Eureka服务注册与服务发现
系列文章目录 【Spring Cloud一】微服务基本知识 Eureka服务注册与服务发现 系列文章目录前言一、什么是Eureka?二、为什么要有服务注册发现中心?三、Eureka的特性四、搭建Eureka单机版4.1Eureka服务端项目代码pom文件配置文件启动类启动项目查看效果 E…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
