Java 实现遍历一个文件夹,文件夹有100万数据,获取到修改时间在2天之内的数据

目录

  • 1 需求
  • 2 实现1(第一种方法)
  • 2 实现2 (推荐使用这个,快)
  • 3 实现3(推荐)

1 需求

现在有一个文件夹,里面会一直存数据,动态的存数据,之后可能会达到100万,1千万数据。

那么为了查询这个文件夹里面2天之内的数据,根据修改时间进行查询,我们如何操作

2 实现1(第一种方法)

/*** 遍历出一个文件夹下的全部的数据* */public static void getAllFile(File fileInput, List<File> allFileList) {// 获取文件列表File[] fileList = fileInput.listFiles();if (!ArrayUtil.isEmpty(fileList)) {for (File file : fileList) {if (file.isDirectory()) {// 递归处理文件夹// 如果不想统计子文件夹则可以将下一行注释掉getAllFile(file, allFileList);} else {// 如果是文件则将其加入到文件数组中allFileList.add(file);}}}}/*** 一个文件夹下前两天的全部的数据* */public static List<File> listOrderByDate(String fliePath) {// 存放的是一个文件夹下的全部的数据List<File> allFileList = new ArrayList<>();getAllFile(new File(fliePath), allFileList);long start = DateUtil.offsetDay(new Date(), -2).getTime();long end = new Date().getTime();List<File> collect = allFileList.parallelStream().filter(x -> x.lastModified() > start && x.lastModified() < end).collect(Collectors.toList());List<File> sortedCollect = collect.stream().sorted((t1, t2) -> Long.compare(t2.lastModified(), t1.lastModified())).collect(Collectors.toList());return sortedCollect;}
 public static void main(String[] args) {long beginTime = System.currentTimeMillis();String psth = "D:\\100w\\dest";// 遍历文件夹List<File> files = listOrderByDate(psth);System.out.println(files.size());long endTime = System.currentTimeMillis();long l = endTime - beginTime;System.out.println(l/1000);

在这里插入图片描述
在这里插入图片描述

使用上面的方法,72608个文件,大小 都是50MB 左右的文件,花费了15秒

2 实现2 (推荐使用这个,快)

 public static void main(String[] args) throws InterruptedException, ExecutionException {long beginTime = System.currentTimeMillis();String folderPath = "D:\\100w\\dest"; // 替换为实际的文件夹路径int numThreads = Runtime.getRuntime().availableProcessors(); // 获取可用的处理器核心数// 获取当前时间Date currentDate = new Date();// 计算两天前的时间long twoDaysAgoMillis = currentDate.getTime() - 2 * 24 * 60 * 60 * 1000;// 创建文件对象表示文件夹File folder = new File(folderPath);// 获取文件夹下的所有文件File[] files = folder.listFiles();// 创建线程池ExecutorService executor = Executors.newFixedThreadPool(numThreads);// 创建任务列表List<Callable<List<File>>> tasks = new ArrayList<>();// 将文件列表分成多个子列表int batchSize = 10000; // 每个子列表的大小if (files != null) {for (int i = 0; i < files.length; i += batchSize) {final int startIndex = i;final int endIndex = Math.min(i + batchSize, files.length);// 创建子任务,每个子任务处理一个子列表的文件Callable<List<File>> task = () -> {List<File> result = new ArrayList<>();for (int j = startIndex; j < endIndex; j++) {File file = files[j];// 检查文件最后修改时间是否在两天内if (file.lastModified() >= twoDaysAgoMillis) {result.add(file);}}return result;};tasks.add(task);}}// 提交并行任务List<Future<List<File>>> futures = executor.invokeAll(tasks);// 收集结果List<File> result = new ArrayList<>();for (Future<List<File>> future : futures) {result.addAll(future.get());}// 关闭线程池executor.shutdown();// 处理结果,例如打印文件名System.out.println(result.size());long endTime = System.currentTimeMillis();long l = endTime - beginTime;System.out.println(l/1000);

在这里插入图片描述
获取是1秒

3 实现3(推荐)

public static void main(String[] args) {long start = System.currentTimeMillis();String folderPath = "D:\\100w\\dest"; // 替换为实际的文件夹路径List<File> modifiedFiles = getModifiedFilesWithinTwoDays(folderPath);System.out.println("修改时间在2天之内的文件数量: " + modifiedFiles.size());long end = System.currentTimeMillis();long ss =  end - start;System.out.println(ss/1000);// 处理修改时间在2天之内的文件数据}public static List<File> getModifiedFilesWithinTwoDays(String folderPath) {List<File> modifiedFiles = new ArrayList<>();File folder = new File(folderPath);if (folder.exists() && folder.isDirectory()) {File[] files = folder.listFiles();if (files != null) {Instant twoDaysAgo = Instant.now().minus(Duration.ofDays(2));for (File file : files) {try {BasicFileAttributes attrs = Files.readAttributes(file.toPath(), BasicFileAttributes.class);Instant lastModifiedTime = attrs.lastModifiedTime().toInstant();if (lastModifiedTime.isAfter(twoDaysAgo)) {modifiedFiles.add(file);}} catch (Exception e) {e.printStackTrace();}}}}return modifiedFiles;}

在这里插入图片描述

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

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

相关文章

JVM-满老师

JVM 前言程序计数器&#xff0c;栈&#xff0c;虚拟机栈&#xff1a;本地方法栈&#xff1a;堆&#xff0c;方法区&#xff1a;堆内存溢出方法区运行时常量池 前言 JVM 可以理解的代码就叫做字节码&#xff08;即扩展名为 .class 的文件&#xff09;&#xff0c;它不面向任何特…

SLAM从入门到精通(python开发)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 在ROS下面&#xff0c;开发的方法很多&#xff0c;可以是c&#xff0c;可以是python。大部分接口操作类的应用&#xff0c;其实都可以用python来开…

Day 04 python学习笔记

Python数据容器 元组 元组的声明 变量名称&#xff08;元素1&#xff0c;元素2&#xff0c;元素3&#xff0c;元素4…….&#xff09; &#xff08;元素类型可以不同&#xff09; eg: tuple_01 ("hello", 1, 2,-20,[11,22,33]) print(type(tuple_01))结果&#x…

<C++> 异常

C语言传统的处理错误的方式 传统的错误处理机制&#xff1a; 终止程序&#xff0c;如assert&#xff0c;缺陷&#xff1a;用户难以接受。如发生内存错误&#xff0c;除0错误时就会终止程序。返回错误码&#xff0c;缺陷&#xff1a;需要程序员自己去查找对应的错误。如系统的…

c++中的动态内存管理

目录 1.内存分布 2.c语言动态内存管理 3.c动态内存管理 4.operator new 与operator delete 函数 5.定位new 6.malloc/free 与 new/delete 的区别 1.内存分布 首先我们需要了解一下数据在内存中的分布&#xff0c;请看以下代码&#xff1a; int globalVar 1; static in…

2023年全球接口IP市场发展趋势分析:市占率第二IP品类,受大数据及计算需求推动高速增长[图]

接口IP是基于标准接口协议&#xff0c;实现芯片与内外部设备进行通信、传输数据的电路模块&#xff0c;分为有线接口IP与无线接口IP&#xff0c;主要用于数字信号处理和嵌入式系统中的接口设计。 接口IP分类 资料来源&#xff1a;共研产业咨询&#xff08;共研网&#xff09; …

计算机视觉——飞桨深度学习实战-深度学习网络模型

深度学习网络模型的整体架构主要数据集、模型组网以及学习优化过程三部分&#xff0c;本章主要围绕着深度学习网络模型的算法架构、常见模型展开了详细介绍&#xff0c;从经典的深度学习网络模型以CNN、RNN为代表&#xff0c;到为了解决显存不足、实时性不够等问题的轻量化网络…

【LeetCode热题100】--226.翻转二叉树

226.翻转二叉树 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

TouchGFX之后端通信

在大多数应用中&#xff0c;UI需以某种方式连接到系统的其余部分&#xff0c;并发送和接收数据。 它可能会与硬件外设&#xff08;传感器数据、模数转换和串行通信等&#xff09;或其他软件模块进行交互通讯。 Model类​ 所有TouchGFX应用都有Model类&#xff0c;Model类除了存…

苹果ios系统ipa文件企业签名是什么?优势是什么?什么场合需要应用到?

企业签名是苹果开发者计划中的一种签名类型&#xff0c;允许企业开发者签署和分发企业内部使用的应用程序&#xff0c;而无需通过App Store进行公开发布。通过企业签名&#xff0c;企业可以在内部部署自己的应用程序&#xff0c;以满足特定的业务需求。 企业签名能够做到以下…

搭建自己的搜索引擎之五

一、前言 接上文 搭建自己的搜索引擎之四&#xff0c;下面继续介绍茴香豆茴字的另外两种写法。 二、Jest Jest是ES的Java Http Rest客户端&#xff0c;它主要是为了弥补以前ES自有API缺少HttpRest接口客户端的不足&#xff0c;但因为现在ES官方已经提供了RestClient ,该项目已…

数据结构和算法

数据结构&#xff1a; 线性结构&#xff1a; 顺序存储方式&#xff0c;顺序表 常见的顺序存储结构有&#xff1a;数组、队列、链表、栈 链式存储方式&#xff0c;链表 非线性结构&#xff1a; 常见的非线性结构有&#xff1a;二维数组、多维数组、广义表、树结构、图结构 实…

Nginx 通过A域名代理B域名,保持A域名访问状态

在某些业务场景中需要一种代理方式&#xff0c;就是隐藏某个域名使用另一个域名去代理被需要隐藏的域名&#xff0c;在别人抓包或者别人查看访问地址的时候&#xff0c;看的域名都不是真实域名地址。所以需要用到这种代理方式。 需要被代理的B域名和地址&#xff1a; https:/…

基于Redis实现消息队列的实践

为什么要基于Redis实现消费队列&#xff1f; 消息队列是一种典型的发布/订阅模式&#xff0c;是专门为异步化应用和分布式系统设计的&#xff0c;具有高性能、稳定性及可伸缩性的特点&#xff0c;是开发分布式系统和应用系统必备的技术之一。目前&#xff0c;针对不同的业务场…

【计算机】CPU,芯片以及操作系统概述

1.CPU 什么是CPU? CPU&#xff08;Central Processing Unit&#xff09;是计算机系统的运算和控制核心&#xff0c;是信息处理、程序运行的最终执行单元&#xff0c;相当于系统的“大脑”。 CPU的工作流程&#xff1f; CPU 的工作流程分为以下 5 个阶段&#xff1a;取指令…

时序分解 | Matlab实现CEEMD互补集合经验模态分解时间序列信号分解

时序分解 | Matlab实现CEEMD互补集合经验模态分解时间序列信号分解 目录 时序分解 | Matlab实现CEEMD互补集合经验模态分解时间序列信号分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现CEEMD互补集合经验模态分解时间序列信号分解 1.分解效果图 &#xff0…

Maven - MacOS 快速安装

配置信息 Maven 版本&#xff1a;3.6.3Maven 地址&#xff1a;Index of /dist/maven/maven-3IDEA&#xff1a;2023 Tips&#xff1a;Maven 版本最好不要超过 3.8.0&#xff0c;最新版 Maven 会不兼容一些配置信息。上面的 Maven 地址里可以选择自己想下载的版本&#xff08;这…

SpringBoot中使用拦截器

拦截器属于MVC中的内容 SpringBoot项目,引入web依赖即可 需要访问的控制器 拦截器第一步实现HandlerInterceptor接口 第二步实现WebMvcConfigurer接口,并重写addInterCeptors()方法,将自定义的拦截器注册 也就是说这里add进去拦截的请求,才会进入到prehandle方法,这里放行的请…

iOS UWB——Neaby Interaction框架(一)

苹果自2019年在iPhone中引入UWB技术&#xff0c;伴随着的就是其应用软件框架Nearby Interaction框架的升级。Nearby Interaction框架&#xff0c;是一个功能强大且易于使用的iOS空间感知能力。通过NI框架&#xff0c;支持开发者和配件制造商将对象检测和设备激活等功能整合到应…

rust生命期

一、生命期是什么 生命期&#xff0c;又叫生存期&#xff0c;就是变量的有效期。 实例1 {let r;{let x 5;r &x;}println!("r: {}", r); }编译错误&#xff0c;原因是r所引用的值已经被释放。 上图中的绿色范围’a表示r的生命期&#xff0c;蓝色范围’b表示…