2012-07-02 28 views
6

Tengo un archivo zip que está dentro de una carpeta en un archivo zip, por favor sugiérame cómo leerlo usando la secuencia de entrada zip.Lea un archivo zip dentro del archivo zip

ej .:

abc.zip 
    | 
     documents/bcd.zip 

Cómo leer un archivo zip en el interior archivo zip?

+1

¿Qué quiere decir por lectura? ¿Quieres extraer bcd.zip? – Sujay

Respuesta

5

El siguiente fragmento de código enumera las entradas de un archivo ZIP dentro de otro archivo ZIP. Adáptelo a sus necesidades. ZipFile usa ZipInputStreams debajo del capó.

El fragmento de código utiliza Apache Commons IO, específicamente IOUtils.copy.

public static void readInnerZipFile(File zipFile, String innerZipFileEntryName) { 
    ZipFile outerZipFile = null; 
    File tempFile = null; 
    FileOutputStream tempOut = null; 
    ZipFile innerZipFile = null; 
    try { 
     outerZipFile = new ZipFile(zipFile); 
     tempFile = File.createTempFile("tempFile", "zip"); 
     tempOut = new FileOutputStream(tempFile); 
     IOUtils.copy(// 
       outerZipFile.getInputStream(new ZipEntry(innerZipFileEntryName)), // 
       tempOut); 
     innerZipFile = new ZipFile(tempFile); 
     Enumeration<? extends ZipEntry> entries = innerZipFile.entries(); 
     while (entries.hasMoreElements()) { 
      ZipEntry entry = entries.nextElement(); 
      System.out.println(entry); 
      // InputStream entryIn = innerZipFile.getInputStream(entry); 
     } 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     // Make sure to clean up your I/O streams 
     try { 
      if (outerZipFile != null) 
       outerZipFile.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     IOUtils.closeQuietly(tempOut); 
     if (tempFile != null && !tempFile.delete()) { 
      System.out.println("Could not delete " + tempFile); 
     } 
     try { 
      if (innerZipFile != null) 
       innerZipFile.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

public static void main(String[] args) { 
    readInnerZipFile(new File("abc.zip"), "documents/bcd.zip"); 
} 
+0

Genial Esto es lo que estoy buscando. Muchas gracias hermano –

+0

tipo impresionante ... gracias ... !!!!! – Milesh

+1

Solución perfecta, exactamente lo que quería y me estaba rompiendo la cabeza durante horas. Me has alegrado el día. Muchas gracias. –

2

Si quiere mirar a través de los archivos zip dentro de archivos zip de forma recursiva,

public void lookupSomethingInZip(InputStream fileInputStream) throws IOException { 
     ZipInputStream zipInputStream = new ZipInputStream(fileInputStream); 
     String entryName = ""; 
     ZipEntry entry = zipInputStream.getNextEntry(); 
     while (entry!=null) { 
      entryName = entry.getName(); 
      if (entryName.endsWith("zip")) { 
       //recur if the entry is a zip file 
       lookupSomethingInZip(zipInputStream); 
      } 
      //do other operation with the entries.. 

      entry=zipInputStream.getNextEntry(); 
     } 
    } 

Llame al método con el flujo de entrada de archivo derivada del archivo -

File file = new File(name); 
lookupSomethingInZip(new FileInputStream(file)); 
+0

recurrir en el mismo zip? Es inútil.. – harvish

0

he escrito un código que puede descomprimir todos los archivos zip dentro de un archivo zip. Incluso puede descomprimir en n niveles de compresión. Al igual que, por ejemplo, si tiene un archivo zip dentro de un archivo comprimido, dentro de un archivo zip (etc.), los extraerá todos. Utilice el método zipFileExtract de esta clase y pase el archivo zip de origen y el directorio de destino como argumento.

import java.io.*; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import java.util.*; 
import java.util.concurrent.ConcurrentLinkedQueue; 
import java.util.zip.ZipEntry; 
import java.util.zip.ZipInputStream; 

public class RecursiveFileExtract { 

private static final int BUFFER_SIZE = 4096; 
private static Queue<File> current; 
private static List<File> visited; 

public static void zipFileExtract(File sourceZipFile, File destinationDirectory) { 
    Path temp = null; 
    if(!destinationDirectory.exists()) 
    { 
     destinationDirectory.mkdirs(); 
    } 
    try { 
     temp = Files.move(Paths.get(sourceZipFile.getAbsolutePath()), Paths.get(destinationDirectory.getAbsolutePath()+File.separator+sourceZipFile.getName())); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    File zipFile = new File(temp.toAbsolutePath().toString()); 
    current = new ConcurrentLinkedQueue<>(); 
    visited = new ArrayList<>(); 
    current.add(zipFile); 
    do { 
     unzipCurrent(); 
     zipFinder(destinationDirectory); 
    } 
    while (!current.isEmpty()); 
} 

private static void zipFinder(File directory) { 
    try { 
     if (directory != null) { 
      File fileArray[] = directory.listFiles(); 
      if (fileArray != null) { 
       for (File file : fileArray) { 
        if (file != null) { 
         if (file.isDirectory()) { 
          zipFinder(file); 
         } else { 
          if (file.getName().endsWith(".zip")) { 
           if (!visited.contains(file)) { 
            current.add(file); 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
    } catch (Exception e) { 
     System.out.println(e.getLocalizedMessage()); 
    } 
} 

private static void unzipCurrent() { 
    try { 
     while (!current.isEmpty()) { 
      File file = current.remove(); 
      visited.add(file); 
      File zipDirectory = new File(file.getParentFile().getAbsolutePath()); 
      unzip(file.getAbsolutePath(), zipDirectory.getAbsolutePath()); 
     } 
    } catch (Exception e) { 
     System.out.println(e.getLocalizedMessage()); 
    } 
} 

public static void unzip(String zipFilePath, String destDirectory) { 
    try { 
     ZipInputStream zipIn = new ZipInputStream(new FileInputStream(zipFilePath)); 
     ZipEntry entry = zipIn.getNextEntry(); 

     while (entry != null) { 
      String filePath = destDirectory + File.separator + entry.getName(); 
      if (!entry.isDirectory()) { 
       extractFile(zipIn, filePath); 
      } else { 

       File dir = new File(filePath); 
       Boolean result = dir.mkdir(); 
      } 
      zipIn.closeEntry(); 
      entry = zipIn.getNextEntry(); 
     } 
     zipIn.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

private static void extractFile(ZipInputStream zipIn, String filePath) { 
    try { 
     File file = new File(filePath); 
     File parentFile = file.getParentFile(); 
     if (!parentFile.exists()) { 
      Boolean result = parentFile.mkdirs(); 
      if (!result) { 
       throw new Exception(); 
      } 
     } 
     BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath)); 
     byte[] bytesIn = new byte[BUFFER_SIZE]; 
     int read = 0; 
     while ((read = zipIn.read(bytesIn)) != -1) { 
      bos.write(bytesIn, 0, read); 
     } 
     bos.close(); 
    } catch (Exception e) { 
     System.out.println(e.getLocalizedMessage()); 
    } 
} 

}

Cuestiones relacionadas