用files.walkfiletree统计“变量文件”总大小需先明确定义(如.properties/.env后缀或内容含key=value),再通过simplefilevisitor过滤、files.size()安全累加long型字节数,并捕获ioexception确保遍历不中断。

用 Files.walkFileTree 统计目录下所有“变量文件”的大小总和,关键在于明确“变量文件”具体指什么——Java 中没有内置的“变量文件”概念,它通常是你业务中约定的一类文件(比如以 .var、.conf、.properties 结尾,或文件名含 var,或内容含特定变量定义语法等)。下面按常见实战场景分步说明,聚焦可运行、易修改的写法。
明确并筛选目标“变量文件”
先定义规则,再用 SimpleFileVisitor 过滤。例如:只统计扩展名为 .properties 和 .env 的文件:
- 在
visitFile方法中用file.getFileName().toString()判断后缀 - 跳过符号链接(加
SKIP_SIBLINGS或手动检查attrs.isSymbolicLink()) - 捕获
IOException防止权限不足导致遍历中断(如某些系统目录)
安全累加文件大小,避免整数溢出
单个文件大小可能超 int 范围,务必用 long 累加,并用 Files.size(path) 获取字节长度:
- 不要用
file.toFile().length(),它对某些特殊路径(如 NFS、符号链接未解析)可能返回 0 或异常 - 在
visitFile中 try-catchIOException,失败时打印警告但不中断遍历 - 示例片段:
try { total += Files.size(file); } catch (IOException e) { System.err.println("skip " + file + ": " + e.getMessage()); }
完整可运行示例(统计 .properties 和 .env 文件总大小)
以下代码可直接编译运行,支持传入目录路径作为参数:
Path start = Paths.get(args.length > 0 ? args[0] : ".");
AtomicLong total = new AtomicLong(0);
Files.walkFileTree(start, new SimpleFileVisitor<path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
String name = file.getFileName().toString();
if (name.endsWith(".properties") || name.endsWith(".env")) {
try {
total.addAndGet(Files.size(file));
} catch (IOException e) {
System.err.println("Cannot read size of " + file);
}
}
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) {
System.err.println("Access denied: " + file);
return FileVisitResult.CONTINUE;
}
});
System.out.println("Total size of variable files: " + total.get() + " bytes");
</path>
进阶:按内容识别“变量文件”(如含 key=value)
若需根据文件内容判断(例如首 1KB 内含 = 且非二进制),可在 visitFile 中轻量读取:
- 用
Files.readAllBytes(file)前加长度限制(如if (Files.size(file) )避免大文件 OOM - 用
new String(bytes, StandardCharsets.UTF_8)解码后简单匹配(如line.contains("=") && !line.trim().startsWith("#")) - 生产环境建议改用
BufferedReader逐行读,控制内存占用










