Apache Commons:能否创建IOFileFilter搜索Zip内的.fot文件?
解决方案:同时搜索本地和ZIP归档内的.fot文件
当然可以实现!而且确实有办法不用大幅改动现有代码,下面分两种贴合你需求的思路:
1. 扩展IOFileFilter实现一站式筛选
如果你已经在使用Apache Commons IO的IOFileFilter,可以自定义一个复合过滤器——既识别本地的.fot文件,又能检测包含.fot文件的ZIP归档,这样现有遍历逻辑几乎不用改:
public class ZipAwareFotFilter implements IOFileFilter { private final IOFileFilter fotFilter = FileFilterUtils.suffixFileFilter(".fot"); @Override public boolean accept(File file) { // 先匹配本地的.fot文件 if (fotFilter.accept(file)) { return true; } // 如果是ZIP文件,扫描内部是否有.fot条目 if (file.getName().toLowerCase().endsWith(".zip")) { try (ZipFile zipFile = new ZipFile(file)) { Enumeration<? extends ZipEntry> entries = zipFile.entries(); while (entries.hasMoreElements()) { ZipEntry entry = entries.nextElement(); if (!entry.isDirectory() && entry.getName().toLowerCase().endsWith(".fot")) { // 返回true表示这个ZIP需要被后续处理(比如提取内部文件路径) return true; } } } catch (IOException e) { // 跳过损坏的ZIP文件,避免中断遍历 e.printStackTrace(); } } return false; } @Override public boolean accept(File dir, String name) { return accept(new File(dir, name)); } }
使用时直接替换你原来的.fot过滤器即可,现有文件遍历逻辑不需要大改——如果需要直接获取归档内的文件路径,可以在过滤器里加个回调或列表来收集结果,不用动核心遍历代码。
2. 轻量适配:现有结果后补充ZIP扫描
如果完全不想修改过滤器,也可以在现有程序找到本地.fot文件后,额外加一段逻辑扫描ZIP内的内容,对原有代码改动极小:
假设你现有代码是这样的:
Collection<File> localFotFiles = FileUtils.listFiles(rootDir, fotFilter, TrueFileFilter.INSTANCE);
只需在后面补充这段:
// 先找到所有ZIP文件 Collection<File> zipFiles = FileUtils.listFiles(rootDir, FileFilterUtils.suffixFileFilter(".zip"), TrueFileFilter.INSTANCE); for (File zip : zipFiles) { try (ZipFile zipFile = new ZipFile(zip)) { Enumeration<? extends ZipEntry> entries = zipFile.entries(); while (entries.hasMoreElements()) { ZipEntry entry = entries.nextElement(); if (!entry.isDirectory() && entry.getName().toLowerCase().endsWith(".fot")) { // 用类似"ZIP路径!内部文件路径"的格式记录归档内文件,适配现有结果结构 String zipInnerPath = zip.getAbsolutePath() + "!" + entry.getName(); // 这里可以根据你现有代码的结果类型处理,比如用自定义包装类或直接存字符串 localFotFiles.add(new FileWrapper(zipInnerPath)); } } } catch (IOException e) { e.printStackTrace(); } }
这种方式相当于在原有结果上“补全”归档内的文件,完全不影响现有核心逻辑。
小提醒
- 如果需要支持更多归档格式(如RAR、7Z),可以用Apache Commons Compress替代JDK自带的
ZipFile,但如果只需要ZIP的话,JDK原生API就足够了。 - 大ZIP文件可以考虑加异步扫描或缓存,但如果现有程序的性能能满足需求,不用额外处理。
内容的提问来源于stack exchange,提问作者pjoter
相关产品推荐
相关产品推荐

