Android开发:如何过滤ListView中不包含指定文件的空文件夹
问题核心原因
你写的第二版代码逻辑出现了嵌套循环重复遍历的错误:只要检测到任意一个文件夹下存在含大写S的文件,就会把根目录下所有符合72天修改时间要求的文件夹都添加到结果列表,完全没有把「含指定文件」和「当前遍历的文件夹」做绑定,所以过滤失效。
修正后的实现代码
public static File dir = new File(Environment.getExternalStorageDirectory().getPath() + "/Sales/Archive"); ArrayList<String> theNamesOfFiles = new ArrayList<>(); File[] filelist = dir.listFiles(); if (filelist == null) { // 目录不存在或无权限时直接返回,避免空指针崩溃 return; } // 先对文件夹按修改时间倒序排序,只需排序一次即可,不要放在循环里重复排序 Arrays.sort(filelist, Comparator.comparingLong(File::lastModified).reversed()); long sevenTwoDaysMs = 72L * 24 * 60 * 60 * 1000; // 直接换算72天的毫秒数,避免除法精度问题 long currentTime = new Date().getTime(); for (File folder : filelist) { // 先校验两个基础条件:是文件夹、修改时间在72天内 if (!folder.isDirectory()) { continue; } long diff = currentTime - folder.lastModified(); if (diff >= sevenTwoDaysMs) { continue; } // 再校验文件夹内是否有名称含大写S的文件 boolean hasValidFile = false; File[] childFiles = folder.listFiles(); if (childFiles != null && childFiles.length > 0) { for (File child : childFiles) { if (child.getName().toUpperCase().contains("S")) { hasValidFile = true; break; // 找到符合要求的文件就跳出子循环,无需继续遍历 } } } // 所有条件都满足才加入结果列表 if (hasValidFile) { theNamesOfFiles.add(folder.getName()); } }
关键优化点说明
- 排序逻辑移到循环外执行,原来的代码放在循环内每遍历一次就排序一次,严重浪费性能
- 用72天对应的毫秒数直接做差值判断,避免多次除法导致的精度误差,计算效率更高
- 增加空指针校验,避免目录无访问权限、目录为空时出现空指针崩溃
- 每个文件夹的校验逻辑独立:先判断是否符合时间要求,再单独校验自身内部是否存在指定格式的文件,符合所有条件才加入列表,不会出现误加其他文件夹的问题
内容的提问来源于stack exchange,提问作者Darsi
相关产品推荐
相关产品推荐

