You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据文件名中的日期获取各类型的最新文件?

获取各类型最新文件的正确实现方案

问题背景

目录下包含以下文件:

users_20221104.txt
users_20221105.txt
users_20221106.txt
dealers_20221104.txt
dealers_20221105.txt
dealers_20221106.txt
nations_20221104.txt
nations_20221105.txt
nations_20221106.txt

需求是获取每种类型(users、dealers、nations)的最新文件(即日期后缀最大的文件),但当前代码存在逻辑缺陷,无法正确筛选出目标文件。

原代码的问题

原代码仅通过遍历覆盖变量值,最终得到的是循环中最后一个遍历到的对应类型文件,但遍历顺序不保证按日期排序,因此大概率无法拿到最新文件。

正确实现思路

  • 解析文件名:从文件名中提取类型前缀和日期后缀(需去除.txt后缀)
  • 比较日期大小:利用YYYYMMDD格式的特性,直接通过字符串字典序比较日期先后(和数值顺序一致)
  • 维护各类型最新文件:对每个类型,每次遇到同类型文件时,比较日期并保留日期更大的文件

完整实现代码

private void downloadFiles() {
    List<String> filesPath = ftpClient.listFiles(ftpFolderIn);
    String usersFileTxt = null;
    String dealerFileTxt = null;
    String nationFileTxt = null;
    
    for (String filepath : filesPath) {
        // 提取纯文件名(若filepath带路径,用File类处理更通用)
        String fileName = new File(filepath).getName();
        String[] nameParts = fileName.split("_");
        
        // 跳过不符合命名规则的文件
        if (nameParts.length != 2) {
            continue;
        }
        
        String fileType = nameParts[0];
        String dateStr = nameParts[1].replace(".txt", "");
        
        // 按类型更新最新文件
        switch (fileType) {
            case "users":
                usersFileTxt = pickLatestFile(usersFileTxt, fileName, dateStr);
                break;
            case "dealers":
                dealerFileTxt = pickLatestFile(dealerFileTxt, fileName, dateStr);
                break;
            case "nations":
                nationFileTxt = pickLatestFile(nationFileTxt, fileName, dateStr);
                break;
            default:
                // 忽略未知类型文件
                break;
        }
    }
    
    // 下载文件,增加判空避免空指针
    if (usersFileTxt != null) {
        usersFile = ftpClient.downloadFile(usersFileTxt);
    }
    if (dealerFileTxt != null) {
        dealerFile = ftpClient.downloadFile(dealerFileTxt);
    }
    if (nationFileTxt != null) {
        nationFile = ftpClient.downloadFile(nationFileTxt);
    }
}

// 辅助方法:比较两个文件的日期,返回最新文件名
private String pickLatestFile(String currentLatest, String newFile, String newDate) {
    if (currentLatest == null) {
        return newFile;
    }
    String currentDate = currentLatest.split("_")[1].replace(".txt", "");
    // 字符串比较:YYYYMMDD格式下字典序等价于日期先后
    return newDate.compareTo(currentDate) > 0 ? newFile : currentLatest;
}

补充说明

  • 若ftpClient.listFiles返回带完整路径的字符串,用new File(filepath).getName()可跨系统提取纯文件名
  • 增加了命名规则校验,跳过不符合类型_日期.txt格式的文件,避免解析错误
  • 下载前增加空指针判断,防止无对应类型文件时触发异常

内容的提问来源于stack exchange,提问作者JhinKazama

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 11:35:17