java统计目录总大小需递归遍历并累加普通文件字节数:file api用listfiles()判空递归,捕获securityexception;files.walk()更推荐,配合filter和maptolong处理异常,注意跳过目录、符号链接及权限不足路径。

在 Java 中统计目录下所有文件的总大小,核心是递归遍历目录树,对每个普通文件调用 File.length()(或 Path.toFile().length()),累加字节数。注意跳过目录、符号链接(可选)、权限不足的文件,并妥善处理异常。
使用 File API(Java 7 之前兼容)
适合简单场景,代码直观:
- 创建
File对象指向目标目录 - 用
listFiles()获取子项,判空避免 NullPointerException - 对每个子项:如果是文件,累加
length();如果是目录,递归调用自身 - 捕获
SecurityException(如无读权限)并跳过,不中断统计
示例片段:
public static long getTotalSize(File dir) {
if (!dir.exists() || !dir.isDirectory()) return 0L;
long size = 0;
File[] children = dir.listFiles();
if (children == null) return 0; // 权限不足或 I/O 错误
for (File child : children) {
if (child.isFile()) {
size += child.length();
} else if (child.isDirectory()) {
size += getTotalSize(child);
}
}
return size;
}
使用 Files.walk()(推荐,Java 8+)
更简洁、支持流式处理和异常控制:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用
Files.walk(dirPath)得到Stream<path></path> - 用
filter(Files::isRegularFile)排除目录和特殊文件 - 用
mapToLong调用Files.size(path)(自动抛出 IOException) - 用
try-catch包裹整个流操作,或用Files.walkFileTree自定义访问器处理异常
安全写法(跳过无法访问的路径):
public static long getTotalSize(Path dir) {
try (Stream<path> stream = Files.walk(dir)) {
return stream
.filter(Files::isRegularFile)
.mapToLong(path -> {
try {
return Files.size(path);
} catch (IOException e) {
return 0L; // 忽略无法读取的文件
}
})
.sum();
} catch (IOException e) {
return 0L;
}
}
</path>
注意事项与优化点
-
不要统计目录本身大小:目录在文件系统中只是元数据,
length()返回 0 或未定义值,只统计普通文件 -
符号链接默认不跟随:
Files.walk()默认不展开软链接;如需跟随,用Files.walk(dir, FileVisitOption.FOLLOW_LINKS) -
大目录慎用递归栈:深度极深时,纯递归可能栈溢出;
Files.walk()内部用队列,更健壮 -
单位转换建议:返回字节后,按需转为 KB/MB(除以 1024 或 1024.0),注意用
long防止溢出
快速验证方法
写完后可用命令行交叉验证(Linux/macOS):
du -sb /path/to/dir | cut -f1
Windows 可用 dir /s 查看“文件数”和“字节数”,注意其统计包含目录开销,结果略大于 Java 纯文件累加值,属正常差异。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










