2012-03-26 15 views
7

Ho un archivio ZIP incorporato in un file più grande. Conosco l'offset iniziale dell'archivio all'interno del file più grande e della sua lunghezza.Lettura di file da un archivio ZIP incorporato

Esistono librerie Java che mi consentono di leggere direttamente i file contenuti nell'archivio? Sto pensando lungo le linee di ZipFile.getInputStream(). Sfortunatamente, ZipFile non funziona per questo caso d'uso poiché i suoi costruttori richiedono un file ZIP standalone.

Per motivi di prestazioni, non riesco a copiare il file ZIP achive in un file separato prima di aprirlo.

modifica: Giusto per essere chiari, ho accesso casuale al file.

+0

'java.util.zip.ZipInputStream.ZipInputStream (InputStream)'? – artbristol

+0

Difficile. Con un file ZIP, è necessario prima leggere la directory, che è alla fine, quindi è necessario un accesso casuale.Potresti * leggere tutte le voci in un colpo solo dall'inizio, e ciò funzionerebbe con la maggior parte dei file zip, ma il formato stesso consente cose divertenti come voci duplicate e dati spazzatura casuali tra le voci. – Thilo

+0

@Thilo: Per essere chiari, ho accesso casuale al file. – NPE

risposta

6

Ho creato un attacco rapido (che deve essere disinfettato qui e là), ma legge il contenuto dei file da un archivio ZIP che è incorporato in un TAR. Utilizza Java6, FileInputStream, ZipEntry e ZipInputStream. 'lavori sulla mia macchina locale':

final FileInputStream ins = new FileInputStream("archive.tar"); 
// Zip starts at 0x1f6400, size is not needed 
long toSkip = 0x1f6400; 
// Safe skipping 
while(toSkip > 0) 
    toSkip -= ins.skip(toSkip); 

final ZipInputStream zipin = new ZipInputStream(ins); 
ZipEntry ze; 
while((ze = zipin.getNextEntry()) != null) 
{ 
    final byte[] content = new byte[(int)ze.getSize()]; 
    int offset = 0; 
    while(offset < content.length) 
    { 
     final int read = zipin.read(content, offset, content.length - offset); 
     if(read == -1) 
      break; 
     offset += read; 
    } 
    // DEBUG: print out ZIP entry name and filesize 
    System.out.println(ze + ": " + offset); 
} 
zipin.close(); 
1

1.creare FileInputStream fis = new FileInputStream (..);

  1. posizionarlo all'inizio del file zip incorporato: fis.skip (offset);

  2. aperta ZipInputStream (FIS)

+0

che dovrebbe funzionare per la maggior parte dei file, ma il formato di file zip consente strane cose come voci duplicate e dati spazzatura casuali tra le voci, quindi sarebbe meglio avere accesso casuale e leggere prima la directory alla fine dell'archivio. – Thilo

-1

7-zip-JavaBinding è un wrapper Java per la libreria C++ 7-zip.

La pagina code snippets ha in particolare alcuni esempi, tra cui la stampa di un elenco di elementi in un archivio, l'estrazione di un singolo file e l'apertura di archivi multiparte.

-1

Controllare se zip4j si aiuta o no.

Si può provare PartInputStream per leggere il file zip secondo il vostro caso d'uso.

Penso che sia meglio creare il file zip temp e quindi accedervi.

1

Suggerisco di utilizzare TrueZIP, fornisce accesso al file system a molti tipi di archivi. Ha funzionato bene per me in passato.

0

Penso che apache commons comprimere possa aiutarti.

Esiste una classe org.apache.commons.compress.archivers.zip.ZipArchiveEntry, che eredita java.util.zip.ZipEntry.

Ha un metodo getDataOffset(), che può ottenere l'offset del flusso di dati all'interno del file di archivio.

Problemi correlati