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.xdnf.cn/news/144773.html

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

相关文章

李航老师《统计学习方法》第五章阅读笔记

决策树&#xff08;decision tree&#xff09;是一种基本的分类与回归方法。本章主要讨论用于分类的决策树。决策树模型呈树形结构&#xff0c;在分类问题中&#xff0c;表示基于特征对实例进行分类的过程。 以下是关于分类决策树的一些基本概念和特点&#xff1a; 树形结构&am…

linux 和 windows的換行符不兼容問題

linux 和 windows的換行符&#xff1a; 1.vim 模式下&#xff0c;執行命令&#xff1a; :set ffunix idea中設置code style

【C++进阶(六)】STL大法--栈和队列深度剖析优先级队列适配器原理

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; 栈和队列 1. 前言2. 栈和队列的接口函数熟悉3. …

【剑指Offer】7.重建二叉树

题目 给定节点数为 n 的二叉树的前序遍历和中序遍历结果&#xff0c;请重建出该二叉树并返回它的头结点。 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6}&#xff0c;则重建出如下图所示。 提示: 1.vin.length pre.length 2.pre 和 vin 均无重复…

软件测试面试经验分享,真实面试题

前言 本人普通本科计算机专业&#xff0c;做测试也有3年的时间了&#xff0c;讲下我的经历&#xff0c;我刚毕业就进了一个小自研薪资还不错&#xff0c;有10.5k&#xff08;个人觉得我很优秀&#xff09;&#xff0c;在里面呆了两年&#xff0c;积累了一些的经验和技能&#…

Elasticsearch基础篇(二):Elasticsearch在windows和liunx上的安装部署

Elasticsearch简介 前言1. Windows环境部署Elasticsearch1.1 下载并解压Elasticsearch压缩包1.2 命令行启动elasticsearch1.3 验证是否成功启动elasticsearch1.4 关闭Elasticsearch1.5 在Windows上安装Elasticsearch作为服务 2. Liunx环境部署Elasticsearch安装 Elasticsearch …

UI自动化测试 | Jenkins配置优化

前一段时间帮助团队搭建了UI自动化环境&#xff0c;这里将Jenkins环境的一些配置分享给大家。 背景&#xff1a; 团队下半年的目标之一是实现自动化测试&#xff0c;这里要吐槽一下&#xff0c;之前开发的测试平台了&#xff0c;最初的目的是用来做接口自动化测试和性能测试&…

java框架-Springboot-快速入门

文章目录 组件注册条件注解属性绑定自动装配原理自定义组件yaml属性配置日志日志级别日志分组文件输出文件归档与文件切割自定义配置切换日志组合 组件注册 Configuration、SpringBootConfigurationBean、ScopeController、Service、Repository、ComponentImportComponentScan…

探索网络世界:常见应用程序详解与实战演练

网络技术已成为现代生活中不可或缺的一部分&#xff0c;各种网络应用也层出不穷。本文将介绍一些常见的网络应用及其使用方法&#xff0c;包括Ping、Tracert、Telnet、FTP、TFTP等&#xff0c;帮助读者更好地理解和使用这些工具。 目 录 Ping和Tracert&#xff1a;网络诊断的好…

brew 安装MySQL 5.7

写在前面&#xff1a;博主是一只经过实战开发历练后投身培训事业的“小山猪”&#xff0c;昵称取自动画片《狮子王》中的“彭彭”&#xff0c;总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域&#xff0c;如今终有小成…

vue pc端/手机移动端 — 下载导出当前表格页面pdf格式

一、需求&#xff1a;在手机端/pc端实现一个表格页面&#xff08;缴费单/体检报告单等&#xff09;的导出功能&#xff0c;便于用户在本地浏览打印。 二、实现&#xff1a;之前在pc端做过预览打印的功能&#xff0c;使用的是print.js之类的方法让当前页面直接唤起打印机的打印预…

【项目】在线音乐播放器测试报告

目录 项目背景 项目功能 测试计划 功能测试 登录页面的测试 测试用例 测试结果 注册页面的测试 测试用例 测试结果 音乐列表页面的测试 测试用例 测试结果 出现的bug 搜索功能的bug 问题解决 删除功能的bug 问题解决 喜欢列表页面的测试 测试用例 测试结果…

计算机MSVCP90.dll怎么重新安装?MSVCP90.dll丢失的解决方法分享

在计算机使用过程中&#xff0c;可能会遇到 MSVCP90.dll 丢失的问题。MSVCP90.dll 是 Microsoft Visual Studio 2008 编译的程序所使用的一个动态链接库&#xff08;DLL&#xff09;文件。当该文件丢失或损坏时&#xff0c;可能会导致一些应用程序无法正常运行。本文将详细介绍…

《The Rise and Potential of Large Language Model Based Agents: A Survey》全文翻译

The Rise and Potential of Large Language Model Based Agents: A Surve - 基于 LLMs 的代理的兴起和潜力&#xff1a;一项调查 论文信息摘要1. 介绍2. 背景2.1 AI 代理的起源2.2 代理研究的技术趋势2.3 为什么大语言模型适合作为代理大脑的主要组件 3. 代理的诞生&#xff1a…

APP渗透测试

APP反抓包突破 抓包失败分析 工具证书未配置 app不使用HTTP/S协议 反模拟器 1.使用真机进行抓包 2.用模拟器模拟真机 3.逆向删除反模拟器代码打包重新测试 反证书 SSL证书绑定分为单向校验和双向校验&#xff0c;单向校验就是客户端校验服务端的证书&#xff0c;双向…

Jenkins 权限管理

关于Role-based Authorization Strategy 使用Jenkins自身的权限管理过于粗糙&#xff0c;无法对单个、一类项目做管理&#xff0c;我们可以使用 Role-based Authorization Strategy插件来管理项目、角色。 首先安装该插件&#xff1a;在Jenkins查看该插件有无安装 在Jenkins-…

机器学习 09 随机森林

三、 偏差和方差 偏差度量了学习算法的期望预测与真实结果的偏离程度, 即刻画了学习算法本身的拟合能力。 方差:离散程度, 也就是该随机变量在其期望值附近的波动程度 噪声表达了在当前任务上&#xff0c;任何学习算法所能达到的期望泛化误差的下界, 即刻画了学习问题本身的难…

【AI绘画】Stable Diffusion WebUI

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

react悬浮球效果展示

1.需求 在开发项目时&#xff0c;当用户登录后&#xff0c;需要在主页显示一个悬浮球&#xff08;可以自由拖动&#xff09;&#xff0c;点击悬浮球后&#xff0c;进入目标页面&#xff0c;如图所示&#xff1a; 2.实现 把上面需要实现的悬浮球功能写成一个组件&#xff0c;页面…

【python入门篇】列表简介及操作(2)

列表是什么&#xff1f; 列表是由一系列按特定顺序排列的元素组成。你可以创建包含字母表中的所有字母、数字 0~9 或所有家庭成员的列表&#xff1b;也可以将任何东西加入列表中&#xff0c;其中的元素之间可以没有任何关系。列表通常包含多个元素&#xff0c;因此给列表指定一…