如何根据文件名中的日期获取各类型的最新文件?
获取各类型最新文件的正确实现方案
问题背景
目录下包含以下文件:
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
相关产品推荐
相关产品推荐

