Lee un archivo zip dentro del archivo zip

Tengo un archivo zip que está dentro de una carpeta en el archivo zip. Por favor, sugiérame cómo leerlo usando el flujo de entrada zip.

P.EJ:

abc.zip | documents/bcd.zip 

¿Cómo leer un archivo zip dentro de un archivo zip?

El siguiente fragmento de código enumera las entradas de un archivo ZIP dentro de otro archivo ZIP. Adáptalo a tus necesidades. ZipFile utiliza ZipInputStream s 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 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"); } 

Si desea mirar los archivos zip en 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 del archivo derivado del archivo –

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

He escrito un código que puede descomprimir todos los archivos zip dentro de un archivo zip. Incluso puede descomprimir a n niveles de compresión. Como, por ejemplo, si tuviera un archivo zip dentro de un archivo zip, dentro de un archivo zip (y así sucesivamente) se extraerían todos. Utilice el método zipFileExtract de esta clase y pase el archivo zip de origen y el directorio de destino como un 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 current; private static List 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()); } } }