如何用Java Streams搜索目录及子目录的.po文件并构建指定HashMap
解决PO文件按目录分组收集问题
需求概述
- 遍历指定根目录(及所有子目录)下所有符合
*_xx_*.po格式的文件 - 将文件按所在目录路径分组,存入
HashMap<String, List<File>>,键为目录路径,值为该目录下的PO文件列表
解决方案代码
import java.io.File; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class PoFileCollector { public static void main(String[] args) { // 替换为你实际要搜索的根目录列表 List<String> targetRootDirs = List.of("dir1", "dir2", "dirn"); Map<String, List<File>> dirPoFileMap = new HashMap<>(); for (String rootDir : targetRootDirs) { try { Files.walk(Paths.get(rootDir)) // 只处理普通文件,排除目录 .filter(Files::isRegularFile) // 过滤后缀为.po的文件 .filter(path -> path.getFileName().toString().endsWith(".po")) // 匹配*_xx_*.po格式(xx为两位语言码) .filter(path -> path.getFileName().toString().matches(".*_[a-z]{2}_.*\\.po")) .forEach(path -> { File poFile = path.toFile(); // 获取文件所在的目录路径作为键 String dirKey = poFile.getParent(); // 若目录未在Map中则创建空列表,再添加当前文件 dirPoFileMap.computeIfAbsent(dirKey, k -> new ArrayList<>()).add(poFile); }); } catch (Exception e) { System.err.println("遍历目录 " + rootDir + " 时出错: " + e.getMessage()); e.printStackTrace(); } } // 示例:打印收集到的结果 dirPoFileMap.forEach((dir, files) -> { System.out.println("目录: " + dir); files.forEach(file -> System.out.println(" - " + file.getName())); System.out.println(); }); } }
代码说明
- 递归遍历优化:用
Files.walk替代手动递归listFiles,自动处理任意深度的子目录,代码更简洁且避免手动递归的边界错误。 - 精准过滤规则:
- 先筛选普通文件,排除目录节点
- 过滤
.po后缀的文件 - 通过正则表达式确保文件名符合
*_语言码_*.po的格式(语言码为两位小写字母)
- 分组逻辑简化:使用
computeIfAbsent方法自动处理HashMap的空值情况,无需手动判断目录是否已存在于Map中。 - 多目录支持:可同时传入多个根目录(如dir1、dir2),一次性完成所有目标目录的遍历收集。
内容的提问来源于stack exchange,提问作者Doesbaddel
相关产品推荐
相关产品推荐

