File.listFiles不支持直接按大小过滤,需用FileFilter在accept()中调用file.length()判断,先isFile()再比较字节数,推荐Lambda写法;替代方案可用Files.walk配合Predicate实现递归筛选。

File.listFiles 本身不支持直接按文件大小过滤,必须配合 FileFilter(或 FilenameFilter)手动实现大小判断逻辑。关键点是:在 accept() 方法中调用 file.length() 获取字节数,并与目标范围比较。
使用 FileFilter 按大小筛选文件(推荐)
FileFilter 能处理文件和目录,更适合大小过滤场景(因为只对普通文件有意义,需先判断 isFile())。示例:筛选大于 1MB 且小于 10MB 的文件:
File dir = new File("/path/to/dir");
File[] largeFiles = dir.listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
if (!file.isFile()) return false; // 只处理文件,跳过目录
long size = file.length(); // 单位:字节
return size > 1024 * 1024 && size < 10 * 1024 * 1024;
}
});Java 8+ 可用 Lambda 简化:
File[] largeFiles = dir.listFiles(file ->
file.isFile() && file.length() > 1_048_576 && file.length() < 10_485_760
);注意 length() 返回值的单位和精度
file.length() 返回 long 类型,单位是字节(不是 KB/MB),且对目录返回 0,对不存在或无权限访问的文件返回 0 —— 所以务必先用 file.isFile() 排除目录和无效项。
立即学习“Java免费学习笔记(深入)”;
- 1KB = 1024 字节,1MB = 1024 × 1024 = 1,048,576 字节
- 避免用浮点数比较(如
size / 1024.0 > 1024),直接用整数运算更可靠 - 如果需按“大于等于”或“小于等于”,注意边界条件(如
>=或<=)
常见过滤需求写法参考
以下为常用大小条件的 accept() 表达式(Lambda 形式):
- 小于 100KB:
file -> file.isFile() && file.length() < 100 * 1024 - 大于等于 5MB:
file -> file.isFile() && file.length() >= 5L * 1024 * 1024(注意5L防止 int 溢出) - 介于 1MB–100MB 之间:
file -> file.isFile() && file.length() >= 1048576 && file.length() <= 100 * 1024L * 1024
替代方案:用 Files.walk + Predicate(Java 7+)
若需递归遍历或更灵活的流式处理,推荐 Files.walk:
try (Stream<Path> stream = Files.walk(Paths.get("/path/to/dir"))) {
List<Path> bigFiles = stream
.filter(Files::isRegularFile)
.filter(p -> {
try {
return Files.size(p) > 1024 * 1024;
} catch (IOException e) {
return false; // 访问失败时跳过
}
})
.collect(Collectors.toList());
}优势是自动跳过权限不足路径、支持深度控制,但非 listFiles 的直接替代,适用于新项目或复杂场景。


















