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

news2024/11/25 12:44:49

目录

  • 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.coloradmin.cn/o/1050637.html

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

相关文章

【接口测试】HTTP协议

一、HTTP 协议基础 HTTP 简介 HTTP 是一个客户端终端&#xff08;用户&#xff09;和服务器端&#xff08;网站&#xff09;请求和应答的标准&#xff08;TCP&#xff09;。通常是由客户端发起一个请求&#xff0c;创建一个到服务器的 TCP 连接&#xff0c;当服务器监听到客户…

【Java 进阶篇】MySQL数据库范式详解

范式是数据库设计中的一种理论方法&#xff0c;旨在通过减少数据冗余来提高数据存储的有效性和完整性。在MySQL数据库中&#xff0c;范式设计是一个重要的概念&#xff0c;它有助于组织和管理数据&#xff0c;确保数据的一致性和可靠性。本文将深入探讨数据库范式&#xff0c;包…

必备基础算法

目录 一、双指针 双指针与链表双指针与链表 二、前缀和 一维二维 三、差分 一维二维 四、深度搜索&#xff0c;dfs dfs数组排列dfs岛屿问题dfs染色法&#xff08;二分图判定&#xff09;dfs路径规划dfs拓扑排序 五、广度搜索&#xff0c;bfs bfs最优路径规划bfsdijkstra 六、单…

Python与数据分析--Pandas操作进阶

目录 1.文件读取方式 1.1.绝对路径读取文件 1.2.相对路径读取文件 2.列表数据操作 2.1.列索引指定 2.2.代码数据对齐 3.创建新CSV文件 4.缺失值处理 4.1.缺失值创建 4.2.缺失值检索 4.3.缺失值查询 4.3.1.isnull()函数判断 4.3.2.notnull()函数判断 4.3.3.any()函数…

数据集笔记:2015上海地铁一卡通数据

数据地址&#xff1a;上海地铁数据_免费高速下载|百度网盘-分享无限制 (baidu.com) 数据介绍 上海2015年几天的地铁一卡通出入站信息 卡号、交易日期、交易时间、公交线路/地铁站点中文名称、行业名称(公交、地铁、出租、轮渡、PR停车场)、交易金额、交易性质(非优惠、优惠、…

3种Renko图表形态FPmarkets3秒轻松判断价格走势

Renko图表形态在交易中的应用并不逊色于其他技术分析方法。相较于普通的烛台图表&#xff0c;使用Renko图表时&#xff0c;有些经典模式更容易被发现和识别&#xff0c;FPmarkets总结这些模式包括&#xff1a; 首先是头和肩膀形态。这是一种价格反转形态&#xff0c;由两个较小…

【软件测试】软件缺陷报告如何编写

废话不多说&#xff0c;三张图说明 软件缺陷报告如何编写 以及 报告的跟踪流程 软件缺陷报告格式 软件缺陷报告内容说明 缺陷状态 - 分为 新建、打开、修复、关闭 - 新建 - 测试人员第一次发现缺陷 - 打开 - 测试将报告交给开发&#xff0c;开发确认缺陷&#xff0c;准备动手…

threejs中模型自定义路线移动

threejs中模型自定义路线移动 生命不息&#xff0c;学习不止 基于r95Threejs版本 此例子中&#xff1a;包括背景设置&#xff1a;天空之盒。 模型的引用&#xff1a;小车和整体 glb模型引用 路线设置(因线line2无法设置宽度,所以选择了用管道&#xff0c;当然也可用点成面&…

MySQL 索引介绍和最佳实践

目录 一、前言二、索引类型1.1 主键索引&#xff08;PRIMARY KEY&#xff09;1.2 唯一索引&#xff08;UNIQUE&#xff09;1.3 普通索引&#xff08;NORMAL&#xff09;1.3.1 单列普通索引1.3.2 单列前缀普通索引1.3.3 多列普通索引1.3.4 多列前缀普通索引 1.4 空间索引&#x…

商场做小程序商城的作用是什么?

商场是众多商家聚集在一起的购物公共场所&#xff0c;大商场也往往入驻着众多行业商家&#xff0c;是每个城市重要的组成部分。 随着互联网电商深入及客户消费行为改变&#xff0c;不少商场如今的客流量非常有限&#xff0c;甚至可以说是员工比客人多&#xff0c;这就导致撤店…

三相Vienna整流器电流畸变的抑制方法

该博客参考丁文龙的博士论文《低成本充电系统高性能多端口Vienna整流器关键控制策略研究》&#xff0c;他的博士论文深入浅出&#xff0c;分析透彻。感谢师妹Miss Young提供的技术指导&#xff0c;她是一位优秀的电力电子工程师&#xff0c;祝她事业顺利&#xff0c;身体健康。…

【教学类-06-06】20230905数字题目随便玩( 加减法、分合、比大小,纸张消耗)

背景需求&#xff1a; 3年前第一次设计加减法题目时&#xff0c;打印了一大堆加减法、数字分合、比大小的纸张。太多了&#xff0c;以至于三年后整理素材库&#xff0c;发现还有很多这样的纸片。这些20以内、50以内的题目难度大、题量多&#xff0c;完全不适合幼儿园孩子做&am…

Linux基础命令汇总

用户管理 su 切换用户&#xff1a;su 用户名 logname 显示当前用户的登录用户名&#xff1a;logname useradd 创建用户&#xff1a;useradd 用户名创建用户时指定用户的主组&#xff1a;useradd -g 组名 用户名 usermod 添加附属组&#xff1a;usermod -G 组…

基于 Python+DenseNet121 算法模型实现一个图像分类识别系统

项目展示 一、介绍 DenseNet&#xff08;Densely Connected Convolutional Networks&#xff09;是一种卷积神经网络&#xff08;CNN&#xff09;架构&#xff0c;2017年由Gao Huang等人提出。该网络的核心思想是密集连接&#xff0c;即每一层都接收其前面所有层的输出作为输…

CISSP学习笔记:安全脆弱性、威胁和对策

第九章 安全脆弱性、威胁和对策 9.1 评估和缓解安全脆弱性 9.1 硬件 处理器执行类型 多任务处理&#xff1a; 同时处理两个或更多任务多处理&#xff1a; 利用多个处理器完成一个应用程序的处理能力多程序设计&#xff1a;通过操作系统对单个处理器上的两个任务进行协调&…

AHH HackerHouse @Move大理站完美谢幕

Antalpha HackerHouse Move 大理站于2023年9月23日在面包树举办了Final DemoDay&#xff0c;这也代表着为期21天的 HackerHouse 活动完美谢幕。 自从9月3日开始&#xff0c;整整21天的共居时间里&#xff0c;我们从个体逐渐融汇成小团队&#xff0c;最终成为了一个紧密团结的大…

新手教程,蛋糕小程序的搭建流程一网打尽

作为一名新手&#xff0c;想要搭建一个蛋糕小程序可能会觉得有些困惑。但是&#xff0c;不用担心&#xff01;今天我将为大家详细介绍蛋糕小程序的搭建流程&#xff0c;并带大家一步步完成。 首先&#xff0c;我们需要登录乔拓云网的后台。在登录成功后&#xff0c;点击进入商城…

OCI 发布了容器运行时和镜像规范!

7 月 19 日是开放容器计划Open Container Initiative&#xff08;OCI&#xff09;的一个重要里程碑&#xff0c;OCI 发布了容器运行时和镜像规范的 1.0 版本&#xff0c;而 Docker 在这过去两年中一直充当着推动和引领的核心角色。 我们的目标是为社区、客户以及更广泛的容器行…

医疗小程序开发:技术门槛高?

随着移动互联网的普及&#xff0c;医疗行业也逐渐转向线上。医疗小程序开发成为了很多企业和医疗机构关注的焦点。但是&#xff0c;对于一些技术小白来说&#xff0c;可能会觉得医疗小程序开发技术门槛高&#xff0c;无从下手。实际上&#xff0c;使用乔拓云平台进入后台&#…

《Python趣味工具》——ppt的操作(刷题版)

前面我们对PPT进行了一定的操作&#xff0c;并将其中的文字提取到了word文档中。现在就让我们来刷几道题巩固巩固吧&#xff01; 文章目录 1. 查看PPT&#xff08;上&#xff09;2. 查看PPT&#xff08;中&#xff09;3. 查看PPT&#xff08;下&#xff09;4. PPT的页码5. 大学…