当前位置: 首页 > news >正文

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.lryc.cn/news/181344.html

相关文章:

  • 持续集成部署-k8s-命令行工具:基础命令的使用
  • 使用python脚本的时间盲注完整步骤
  • C++项目:仿mudou库one thread one loop式并发服务器实现
  • 【算法训练-贪心算法 一】买卖股票的最佳时机II
  • 单阶段目标检测与双阶段目标检测的联系与区别
  • Mysql技术文档--设计表规范式-一次性扫盲
  • python socket 传输opencv读取的图像
  • APACHE NIFI学习之—UpdateAttribute
  • BIT-7文件操作和程序环境(16000字详解)
  • 冥想第九百二十八天
  • 深入浅出,SpringBoot整合Quartz实现定时任务与Redis健康检测(一)
  • Lucene-MergePolicy详解
  • 数据的加解密
  • 【Spring】更简单的读取和存储对象
  • 【LeetCode热题100】--108.将有序数组转换为二叉搜索树
  • Redis学习笔记(下):持久化RDB、AOF+主从复制(薪火相传,反客为主,一主多从,哨兵模式)+Redis集群
  • 【智能家居项目】裸机版本——设备子系统(LED Display 风扇)
  • [Linux]记录plasma-wayland下无法找到HDMI接口显示器的问题解决方案
  • 【计算机网络】高级IO之select
  • 如何设计一个高效的应用缓冲区【一个动态扩容的buffer类】
  • 图像处理初学者导引---OpenCV 方法演示项目
  • 管道-匿名管道
  • 【JavaEE基础学习打卡08】JSP之初次认识say hello!
  • 使用序列到序列深度学习方法自动睡眠阶段评分
  • 【算法】排序——选择排序和交换排序(快速排序)
  • Docker 容器监控 - Weave Scope
  • Spring Boot集成redis集群拓扑动态刷新
  • COCI2022-2023#1 Neboderi
  • 由于找不到d3dx9_43.dll无法继续执行此代码怎么解决?全面解析d3dx9_43.dll
  • Linux--网络编程-字节序