Files.list() 一行代码可统计目录下普通文件总数,但不递归子目录;需用 try-with-resources 处理异常并关闭流,统计特定后缀文件可在 filter 中叠加条件,递归统计须改用 Files.walk()。

直接用 Files.list() 配合 Lambda 和 Stream API,一行代码就能统计目录下文件总数(不含子目录中的文件)。
基础用法:统计当前目录下的普通文件数量
Files.list() 返回一个 Stream<path></path>,你可以用 filter() 筛出文件(排除目录),再用 count() 计数:
long fileCount = Files.list(Paths.get("your/dir/path"))
.filter(Files::isRegularFile)
.count();
注意:Files::isRegularFile 只匹配普通文件(不包括目录、符号链接、设备文件等)。如果目录为空或不存在,会抛出 IOException,建议包裹 try-catch。
立即学习“Java免费学习笔记(深入)”;
安全写法:处理异常和关闭流
Files.list() 返回的 Stream 是基于底层资源的,必须确保及时关闭(尤其在异常时)。推荐用 try-with-resources:
- 用
try (Stream<path> stream = Files.list(...)) { ... }</path>自动释放资源 - 捕获
IOException,避免程序崩溃 - 对 null 路径或不存在路径做前置判断更稳妥
示例:
long count = 0;
Path dir = Paths.get("data");
if (Files.exists(dir) && Files.isDirectory(dir)) {
try (Stream
count = stream.filter(Files::isRegularFile).count();
} catch (IOException e) {
e.printStackTrace();
}
扩展:只统计特定后缀的文件(比如 .txt)
在 filter() 中叠加条件即可:
long txtCount = Files.list(Paths.get("logs"))
.filter(Files::isRegularFile)
.filter(p -> p.toString().endsWith(".txt"))
.count();
更健壮的方式是用 String.valueOf(p.getFileName()).endsWith(...),避免路径分隔符干扰;或者用 Files.isSameFile() / FilenameFilter 做更复杂匹配,但简单后缀用 toString() 足够。
注意:Files.list() 不递归
这个方法只列出指定目录的**直接子项**,不会进入子文件夹。如果需要递归统计所有文件(含子目录),应改用 Files.walk():
long totalFiles = Files.walk(Paths.get("root"))
.filter(Files::isRegularFile)
.count();
walk() 默认深度不限,也可传入第二个参数限制层级(如 Files.walk(path, 2) 表示最多遍历两层)。


















