2012-03-26 7 views
7

Tengo un archivo ZIP que está incrustado dentro de un archivo más grande. Sé el desplazamiento de inicio del archivo dentro del archivo más grande y su longitud.Lectura de archivos desde un archivo ZIP incrustado

¿Hay alguna biblioteca de Java que me permita leer directamente los archivos contenidos en el archivo? Estoy pensando en las líneas de ZipFile.getInputStream(). Desafortunadamente, ZipFile no funciona para este caso de uso ya que sus constructores requieren un archivo ZIP independiente.

Por motivos de rendimiento, no puedo copiar el archivo adjunto ZIP en un archivo por separado antes de abrirlo.

edit: Para que quede claro, tengo acceso aleatorio al archivo.

+0

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

+0

Difícil. Con un archivo ZIP, primero debe leer el directorio, que está al final, por lo que necesita acceso aleatorio.Usted * podría * leer todas las entradas de una vez desde el principio, y eso funcionaría con la mayoría de los archivos zip, pero el formato en sí mismo permite cosas divertidas como entradas duplicadas y datos basura aleatorios entre las entradas. – Thilo

+0

@Thilo: Para que quede claro, tengo acceso aleatorio al archivo. – NPE

Respuesta

6

He encontrado un truco rápido (que debe desinfectarse aquí y allá), pero lee el contenido de los archivos de un archivo ZIP que está incrustado dentro de un TAR. Utiliza Java6, FileInputStream, ZipEntry y ZipInputStream. 'funciona en mi máquina local':

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.create FileInputStream fis = new FileInputStream (..);

  1. posición que al principio del archivo zip incorporado: fis.skip (offset);

  2. abierta ZipInputStream (FIS)

+0

que debería funcionar para la mayoría de los archivos, pero el formato de archivo zip permite cosas raras como entradas duplicadas y datos basura aleatorios entre las entradas, por lo que sería mejor tener acceso aleatorio y leer primero el directorio al final del archivo. – Thilo

-1

7-zip-JavaBinding es un contenedor de Java para la biblioteca C++ 7-zip.

La página code snippets en particular tiene algunos buenos ejemplos que incluyen la impresión de una lista de elementos en un archivo, la extracción de un solo archivo y la apertura de archivos de varias partes.

-1

Compruebe si zip4j le ayuda o no.

Puede intentar PartInputStream para leer el archivo zip según su caso de uso.

Creo que es mejor crear un archivo zip temporal y luego acceder a él.

1

Sugiero usar TrueZIP, proporciona acceso al sistema de archivos para muchos tipos de archivos. Me funcionó bien en el pasado.

0

Creo que apache commons compress puede ayudarlo.

Hay una clase org.apache.commons.compress.archivers.zip.ZipArchiveEntry, que hereda java.util.zip.ZipEntry.

Tiene un método getDataOffset(), que puede obtener el desplazamiento de la secuencia de datos dentro del archivo de almacenamiento.

Cuestiones relacionadas