sclass Zip2Zip_CollectFiles { File inZip; ZipOutputStream outZip; Set filesWritten; IPred predicate = name -> true; run { ZipFile zipFile = new ZipFile(inZip); try { Enumeration entries = zipFile.entries(); while (entries.hasMoreElements()) { ZipEntry entry = (ZipEntry) entries.nextElement(); if (entry.isDirectory()) continue; S name = entry.getName(); if (!predicate.get(name)) continue; if (!filesWritten.add(name)) continue; ZipEntry e = new ZipEntry(name); modifyZipEntry(e); outZip.putNextEntry(e); copyStreamAndCloseInput(zipFile.getInputStream(entry), outZip); } } finally { zipFile.close(); } } swappable void modifyZipEntry(ZipEntry e) {} }