java统计目录文件数量与类型分布需递归遍历+安全后缀提取+hashmap聚合:递归处理子目录,null检查listfiles(),后缀提取防无扩展名或点开头,tolowercase统一大小写,getordefault简化计数,treemap可排序输出。

Java 中统计目录下文件数量与类型分布,核心是递归遍历 + 后缀提取 + 计数聚合。关键不在“能不能”,而在“怎么组织更健壮、更清晰”。
递归遍历所有层级子目录
必须用递归处理嵌套结构,否则只会统计当前层。`File.listFiles()` 返回当前目录下的文件/子目录数组,对每个元素判断:
- 如果是目录(file.isDirectory()),就再次调用统计方法
- 如果是文件(file.isFile()),就提取扩展名并计数
- 务必检查 listFiles() 返回值是否为 null(权限不足、路径无效时会返回 null),避免空指针异常
安全提取文件后缀名
不能直接用 substring(lastIndexOf(".")),因为文件可能无扩展名(如 README)或以点开头(如 .gitignore)。推荐做法:
- 用 fileName.lastIndexOf(".") 获取位置
- 若位置 ≤ 0 或等于
fileName.length()-1,视为无有效扩展名,可统一记为 "noext" 或 "unknown" - 否则取 substring(pos + 1),再转小写(toLowerCase())保证
JPG和jpg归为一类
用 HashMap 统计类型与数量
键用字符串(如 "java"、"pdf"),值用整型计数。利用 getOrDefault(key, 0) + 1 简化逻辑:
map.put(ext, map.getOrDefault(ext, 0) + 1);- 比先判断
containsKey再分两支赋值更简洁、线程安全(单线程场景下) - 若需按字母顺序输出,可用 TreeMap 替代 HashMap
区分统计目标:总数 vs 分类型
两种常见需求对应不同实现粒度:
- 只要总文件数:定义一个 static int count = 0,每次遇到文件就
count++ - 要按类型分布:必须用 Map 存储键值对,最后遍历输出,例如:
txt: 12个
java: 8个
png: 24个 - 如还需统计大小,可另建 HashMap
累加 file.length()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











