Modo elegante per contare il numero di file nell'archivio Zip

0

Ho bisogno di contare il numero di file in diversi archivi zip per il controllo degli errori. Ho trovato diverse risposte su SO ma niente di elegante. Al momento ho il seguente codice che funziona ma non è carino:

File[] fileListing = new File("ZipFiles").listFiles();
int numberOfFilesInAllZipArchives = 0;
for(File file : fileListing)
{
    ZipFile zf = new ZipFile(file.getName());
    numberOfFilesInAllZipArchives += zf.size();
    zf.close();
}

C'è un modo per aggirare la creazione di un oggetto per ogni file zip o rendere questo processo più snello?

Grazie!

    
posta D. Gibbs 18.04.2015 - 00:30
fonte

1 risposta

2

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
    
risposta data 18.04.2015 - 05:36
fonte

Leggi altre domande sui tag