L'unica cosa che vedo inelegante della tua implementazione è l'intreccio del lavoro di elenco dei file, del lavoro di apertura / chiusura del file zip e del lavoro di conteggio. (Hai un altro problema con questo?)
Soluzione 1: utilizza il blocco try-with-resources di Java per automatizzare il lavoro di chiusura dei file grazie a ZipFile che è AutoCloseable:
...
try (ZipFile zf = new ZipFile(file) {
numberOfFilesInAllZipArchives += zf.size();
}
...
Soluzione 2: In Groovy, separa il lavoro di elenco dei file (e aggiungi il filtro dei nomi dei file):
import java.util.zip.ZipFile
def dir = new File('Downloads')
def num = 0
dir.eachFileMatch(~/.*\.zip/) { f ->
def z = new ZipFile(f)
num += z.size()
z.close()
}
println num
Soluzione 3: Separa anche il lavoro di apertura / chiusura di ZipFile usando l'idioma "con" di Groovy, aggiungendo un metodo zipFileWith(closure)
alla classe File
:
import java.util.zip.ZipFile
File.metaClass.zipFileWith = { closure ->
def zf = new ZipFile(delegate)
try {
closure(zf)
} finally {
zf?.close()
}
}
def dir = new File('Downloads')
def num = 0
dir.eachFileMatch(~/.*\.zip/) { file ->
file.zipFileWith { zf -> num += zf.size() }
}
println num
Soluzione 4: aggiungi un metodo eachZipFile(closure)
alla classe File
:
import java.util.zip.ZipFile
File.metaClass.eachZipFile = { closure ->
delegate.eachFileMatch(~/.*\.zip/) { file ->
def zf = new ZipFile(file)
try {
closure(zf)
} finally {
zf?.close()
}
}
}
def dir = new File('Downloads')
def num = 0
dir.eachZipFile { zf -> num += zf.size() }
println num