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

如何用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();
        });
    }
}

代码说明

  1. 递归遍历优化:用Files.walk替代手动递归listFiles,自动处理任意深度的子目录,代码更简洁且避免手动递归的边界错误。
  2. 精准过滤规则:
    • 先筛选普通文件,排除目录节点
    • 过滤.po后缀的文件
    • 通过正则表达式确保文件名符合*_语言码_*.po的格式(语言码为两位小写字母)
  3. 分组逻辑简化:使用computeIfAbsent方法自动处理HashMap的空值情况,无需手动判断目录是否已存在于Map中。
  4. 多目录支持:可同时传入多个根目录(如dir1、dir2),一次性完成所有目标目录的遍历收集。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 20:39:14