Java文件遍历那些事

news2024/11/30 0:41:43

文章目录

  • 一、简要概述
  • 二、文件遍历几种实现
    • 1. java实现
    • 2. Apache common-io
    • 3. Spring
  • 三、最终结论

一、简要概述

文件遍历基本上是每个编程语言具备的基本功能,Java语言也不例外。下面我们以java原生实现,Apache common-io、spring框架实现为例来比较各自实现的异同。

二、文件遍历几种实现

为了方便比较,我们以window OS的系统图片文件目录为例,来进行遍历。

1. java实现


import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.util.Arrays;
import java.util.stream.Stream;

import org.apache.commons.io.filefilter.DirectoryFileFilter;
import org.apache.commons.io.filefilter.FileFileFilter;
import org.apache.commons.lang3.StringUtils;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import lombok.extern.slf4j.Slf4j;

/**
 * 文件遍历
 */
@Slf4j
public class FileListByJava
{
    String path = System.getenv().get("USERPROFILE") + "\\Pictures\\";
    
    File searchFile = new File(path);
    
    @BeforeEach
    public void before()
    {
        log.info(path);
    }
    
    /**
     * 遍历文件
     */
    @Test
    public void testList()
    {
        Arrays.stream(searchFile.list()).forEach(System.out::println);
    }
    
    /**
     * 遍历文件
     */
    @Test
    public void testFile()
    {
        File[] files = searchFile.listFiles((FileFilter)FileFileFilter.FILE);
        Stream.of(files).forEach(System.out::println);
        
        // 等价lambda写法
        files = searchFile.listFiles((file) -> file.isFile());
        Stream.of(files).forEach(System.out::println);
    }
    
    /**
     * 遍历目录
     */
    @Test
    public void testDirectory()
    {
        File[] files = searchFile.listFiles((FileFilter)DirectoryFileFilter.DIRECTORY);
        Stream.of(files).forEach(System.out::println);
        
        // 等价lambda写法
        files = searchFile.listFiles((file) -> file.isDirectory());
        Stream.of(files).forEach(System.out::println);
    }
    
    /**
     * 自定义文件名过滤遍历
     */
    @Test
    public void testFileName()
    {
        File[] files = searchFile.listFiles(new FilenameFilter()
        {
            @Override
            public boolean accept(File dir, String name)
            {
                // 广义的文件包含目录,name为文件(包含目录)名称
                return StringUtils.endsWithAny(name, "abc", ".jpg", ".png");
            }
        });
        Stream.of(files).forEach(System.out::println);
        
        // 等价lambda写法
        files = searchFile.listFiles((d, s) -> StringUtils.endsWithAny(s, "abc", ".jpg", ".png"));
        Stream.of(files).forEach(System.out::println);
    }
}

2. Apache common-io


import java.io.File;
import java.util.Collection;
import java.util.concurrent.atomic.AtomicInteger;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.DirectoryFileFilter;
import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.io.filefilter.NotFileFilter;
import org.apache.commons.io.filefilter.TrueFileFilter;
import org.junit.jupiter.api.Test;

public class FileListByApache
{
    String path = System.getenv().get("USERPROFILE") + "\\Pictures\\";
    
    File searchFile = new File(path);
    
    /**
     * 遍历文件目录
     * 
     */
    @Test
    public void testListFilesAndDirs001()
    {
        Collection<File> files = FileUtils.listFilesAndDirs(searchFile, new NotFileFilter(TrueFileFilter.TRUE), DirectoryFileFilter.DIRECTORY);
        files.stream().forEach(System.out::println);
    }
    
    /**
     * 遍历文件目录
     * 
     */
    @Test
    public void testListFilesAndDirs002()
    {
        Collection<File> files = FileUtils.listFilesAndDirs(searchFile, TrueFileFilter.TRUE, DirectoryFileFilter.DIRECTORY);
        files.stream().forEach(System.out::println);
    }
    
    /**
     * 遍历文件
     * 
     */
    @Test
    public void testListFiles001()
    {
        // 搜索子目录
        Collection<File> pics = FileUtils.listFiles(searchFile, new String[] {"jpg", "png"}, true);
        pics.stream().forEach(System.out::println);
        
        // 搜索子目录
        Collection<File> pngs = FileUtils.listFiles(searchFile, FileFilterUtils.suffixFileFilter("png"), TrueFileFilter.INSTANCE);
        pngs.stream().forEach(System.out::println);
    }
    
    /**
     * 遍历文件
     * 
     */
    @Test
    public void testListFiles002()
    {
        // 不搜索子目录
        Collection<File> pics = FileUtils.listFiles(searchFile, new String[] {"jpg", "png"}, false);
        pics.stream().forEach(System.out::println);
        
        // 不搜索子目录
        Collection<File> pngs = FileUtils.listFiles(searchFile, FileFilterUtils.suffixFileFilter("png"), null);
        pngs.stream().forEach(System.out::println);
    }
    
    /**
     * 遍历文件
     * 
     */
    @Test
    public void testListFiles003()
    {
        // 下面用法区别?
        AtomicInteger count = new AtomicInteger();
        FileUtils.listFiles(searchFile, TrueFileFilter.TRUE, DirectoryFileFilter.DIRECTORY).stream().peek(f -> System.out.print(count.incrementAndGet() + ".\t")).forEach(System.out::println);
        
        count.set(0);
        FileUtils.listFiles(searchFile, TrueFileFilter.TRUE, TrueFileFilter.INSTANCE).stream().peek(f -> System.out.print(count.incrementAndGet() + ".\t")).forEach(System.out::println);
    }
}

并且内置了多种文件过滤器实现

在这里插入图片描述

3. Spring


import java.io.IOException;
import java.util.Arrays;

import org.junit.jupiter.api.Test;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

public class FileListBySpring
{
    PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
    
    String userProfile = "file:" + System.getenv().get("USERPROFILE");
    
    /**
     * 遍历文件
     * 
     * @throws IOException
     */
    @Test
    public void testList()
        throws IOException
    {
        // 外部文件
        Resource[] jpgs = resolver.getResources(userProfile + "/Pictures/**/*.jpg");
        Arrays.stream(jpgs).forEach(System.out::println);
        
        // 外部文件
        Resource[] pngs = resolver.getResources(userProfile + "/Pictures/**/*.png");
        Arrays.stream(pngs).forEach(System.out::println);
        
        // 工程或jar内文件
        Resource[] xmls = resolver.getResources("classpath*:**/*.xml");
        Arrays.stream(xmls).forEach(System.out::println);
    }
}

三、最终结论

  1. java原生文件遍历只支持同级目录遍历文件或目录,支持定制过滤规则
  2. Apache common-io功能是最强大的,支持当前目录及子目录递归遍历,支持定制过滤规则
  3. Spring 也支持当前目录及子目录递归遍历,但是只支持同一种文件类型的过滤,假如你需要同时处理多种文件后缀格式,e.g: 需要同时搜索jpg、png两种格式文件,处理比较麻烦,同时支持外部、工程或jar内文件,并且工程内文件和Jar内文件实现了调用方式的统一。

各位同学可根据不同场合和需要,选择使用!


有任何问题和建议,都可以向我提问讨论,大家一起进步,谢谢!

-over-

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

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

相关文章

硬件基础22 反馈放大电路

目录 一、反馈的基本概念与分类 1、什么是反馈 2、直流反馈与交流反馈 3、正反馈与负反馈 4、串联反馈与并联反馈 5、电压反馈与电流反馈 二、负反馈四种组态 1、电压串联负反馈放大电路 2、电压并联负反馈放大电路 3、电流串联负反馈放大电路 4、电流并联负反馈放大…

【JS】React与Vue的异步编程对比:深度解析与实战案例全面指南

文章目录 前言更多实用工具React与Vue概述ReactVue 异步编程基础回调函数PromiseAsync/Await React中的异步编程使用Axios进行数据请求异步操作与组件生命周期React Hooks中的异步处理 Vue中的异步编程使用Axios进行数据请求异步操作与Vue生命周期Vue Composition API中的异步处…

【iOS】知乎日报总结

文章目录 前言首页网络请求轮播图上滑加载图片请求 文章详情页WKWebView的使用点赞、收藏持久化——FMDB的使用 其他问题沙盒问题单元格点击其他 总结 前言 在系统学习了OC语言和UI控件后&#xff0c;知乎日报是第一个比较大的项目&#xff0c;耗时一个多月时间&#xff0c;里面…

算法竞赛(Python)-链表

文章目录 一 链表简介1.1链表定义1.2 双向链表1.3 循环链表 二、链表的基本操作2.1 链表的结构定义2.2 建立一个线性链表2.3 求线性链表的长度2.4 查找元素2.5 插入元素2.5.1 链表头部插入元素2.5.2 链表尾部插入元素2.5.3 链表中间插入元素 2.6 改变元素2.7 删除元素2.7.1 链表…

Unity ShaderLab 实现网格爆炸

实现思路&#xff1a; 沿着3D物体每个面的法线&#xff0c;将面偏移一定的位置。 Shader Graph实现如下&#xff1a; Shader Lab 实现如下&#xff1a; Shader "Unlit/MeshExplode" {Properties{_MainTex ("Texture", 2D) "white" {}_Distan…

快速上手:如何开发一个实用的 Edge 插件

在日常浏览网页时&#xff0c;背景图片能够显著提升网页的视觉体验。如果你也想为自己的浏览器页面添加个性化背景图片&#xff0c;并希望背景图片设置能够持久保存&#xff0c;本文将介绍如何通过开发一个自定义Edge插件来实现这一功能。我们将涵盖保存背景设置到插件选项页&a…

【Maven】功能和核心概念

1. 什么是Maven 1.1 Maven的概念 Maven 是 Apache 软件基金会组织维护的一款自动化构建工具&#xff0c;专注服务于 Java 平台的项目构建和依赖管理。 1.2 为什么要使用Maven&#xff1f; 在项目开发中&#xff0c;我们需要引用各种 jar 包&#xff0c;引用的 jar 包可能有…

神经网络归一化方法总结

在深度学习中&#xff0c;归一化 是提高训练效率和稳定性的关键技术。以下是几种常见的神经网络归一化方法的总结&#xff0c;包括其核心思想、适用场景及优缺点。 四种归一化 特性Batch NormalizationGroup NormalizationLayer NormalizationInstance Normalization计算维度…

视频汇聚平台Liveweb国标GB28181视频平台监控中心设计

在现代安防视频监控领域&#xff0c;Liveweb视频汇聚平台以其卓越的兼容性和灵活的拓展能力&#xff0c;为用户提供了一套全面的解决方案。该平台不仅能够实现视频的远程监控、录像、存储与回放等基础功能&#xff0c;还涵盖了视频转码、视频快照、告警、云台控制、语音对讲以及…

hubu新星杯实践能力赛模拟赛web/Misc-wp

ez_eval <?php highlight_file(__FILE__); error_reporting(0);$hubu $_GET[hubu];eval($hubu);?> 先进行代码审计&#xff0c;GET传参hubu&#xff0c;并执行命令&#xff0c;没有任何绕过&#xff0c;放开手脚去做 payload: ?hubusystem(cat /f*); #直接rcerc…

【前端】跨域问题与缓存

报错如下&#xff1a; 原因&#xff1a; 浏览器 缓存跨域&#xff0c;顾名思义是由于浏览器的缓存机制导致的一种跨域情况。这种跨域一般会出现在浏览器通过一些无视跨域的标签和css(如img、background-image)缓存了一些图片资源之后&#xff0c;当再次发起图片请求时&#xff…

抓包之OSI七层模型以及TCPIP四层模型

写在前面 本文看下OSI七层模型以及TCP/IP四层网络模型&#xff0c;并尝试使用wireshark进行验证。 1&#xff1a;OSI七层网络模型和TCP/IP四层模型 全称&#xff1a;open system interconnection。 需要注意OSI七层模型最终是没有落地的&#xff0c;最终落地的是与之类似的…

#渗透测试#红蓝攻防#HW#漏洞挖掘#漏洞复现02-永恒之蓝漏洞

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

MTK 展锐 高通 sensorhub架构

一、MTK平台 MTK框架可以分为两部分&#xff0c;AP和SCP。 AP是主芯片&#xff0c;SCP是协处理器&#xff0c;他们一起工作来处理sensor数据。 SCP 是用来处理sensor和audio相关功能和其他客制化需求的一个协处理理器&#xff0c;MTK SCP选择freeRTOS作为操作系统&#xff0c…

视觉语言模型(VLM)学习笔记

目录 应用场景举例 VLM 的总体架构包括&#xff1a; 深度解析&#xff1a;图像编码器的实现 图像编码器&#xff1a;视觉 Transformer 注意力机制 视觉-语言投影器 综合实现 训练及注意事项 总结 应用场景举例 基于文本的图像生成或编辑&#xff1a;你输入 “生成一张…

[AutoSar]BSW_Diagnostic_007 BootLoader 跳转及APP OR boot response 实现

目录 关键词平台说明背景一、Process Jump to Bootloader二、相关函数和配置2.1 Dcm_GetProgConditions()2.2 Dcm_SetProgConditions() 三、如何实现在APP 还是BOOT 中对10 02服务响应3.1 配置3.2 code 四、报文五、小结 关键词 嵌入式、C语言、autosar、OS、BSW、UDS、diagno…

如何启用本机GPU硬件加速猿大师播放器网页同时播放多路RTSP H.265 1080P高清摄像头RTSP视频流?

目前市面上主流播放RTSP视频流的方式是用服务器转码方案&#xff0c;这种方案的好处是兼容性更强&#xff0c;可以用于不同的平台&#xff0c;比如&#xff1a;Windows、Linux或者手机端&#xff0c;但是缺点也很明显&#xff1a;延迟高、播放高清或者同时播放多路视频视频容易…

设置ip和代理DNS的WindowsBat脚本怎么写?

今天分享一个我们在工作时&#xff0c;常见的在Windows中通过批处理脚本&#xff08;.bat 文件&#xff09;来设置IP地址、代理以及DNS 相关配置的示例&#xff0c;大家可以根据实际需求进行修改调整。 一、设置静态IP地址脚本示例 以下脚本用于设置本地连接&#xff08;你可…

深度学习-49-AI应用实战之基于HyperLPR的车牌识别

文章目录 1 车牌识别系统1.1 识别原理1.1.1 车牌定位1.1.2 字符识别2 实例应用2.1 安装hyperlpr32.2 识别结果2.3 可视化显示2.4 结合streamlit3 附录3.1 PIL.Image转换成OpenCV格式3.2 OpenCV转换成PIL.Image格式3.3 st.image嵌入图像内容3.4 参考附录1 车牌识别系统 车牌识别…

基于深度学习的手势识别算法

基于深度学习的手势识别算法 概述算法原理核心逻辑效果演示使用方式参考文献 概述 本文基于论文 [Simple Baselines for Human Pose Estimation and Tracking[1]](ECCV 2018 Open Access Repository (thecvf.com)) 实现手部姿态估计。 手部姿态估计是从图像或视频帧集中找到手…