简体   繁体   中英

How to unzip a zip file within a zip file in java

I've used the code below for extracting the contents of a zip file with no issues. Recently I got a requirement to unzip a zip file located within a zip file and have struggled to get the processing logic correct. I invision on routine that will read through a zip file and fill an array of all files containing .log in them. My challenge is how to have the routine call itself when another zip file is located.

    try 
    {
        ZipInputStream zipinputstream = null;
        ZipEntry zipentry;
        ZipFile zf = new ZipFile(passed_ZipFile);
        ZipFile zf = new ZipFile("c:\\temp\\myzipFile.zip");
        Enumeration entries = zf.entries();
        zipinputstream = new ZipInputStream(new FileInputStream(passed_ZipFile));
        zipentry = zipinputstream.getNextEntry();
        while (zipentry != null)
        {
            String entryName = filename;
            zipentry = (ZipEntry) entries.nextElement();
            RandomAccessFile  rf;
            File newFile = new File(entryName);
            String directory = newFile.getParent();
            if(directory == null)
            {
                if(newFile.isDirectory())
                {
                    zipentry = zipinputstream.getNextEntry();
                    break;
                }
            }
            filename = zipentry.getName();

            if (zipentry.getName().contains(".log")) 
            {
                // Perform log processing
            }
            else if (zipentry.getName().contains(".zip")) 
            {
                Call same routine passing the zip file - The routine will then process all files in the zip file
            }

This is how you can recursively unzip zipped files.

package com.test;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

public class Unzipper { 
    private final static int BUFFER_SIZE = 2048;
    private final static String ZIP_FILE = "/home/anton/test/test.zip";
    private final static String DESTINATION_DIRECTORY = "/home/anton/test/";
    private final static String ZIP_EXTENSION = ".zip";

    public static void main(String[] args) {
     System.out.println("Trying to unzip file " + ZIP_FILE);
        Unzipper unzip = new Unzipper(); 
        if (unzip.unzipToFile(ZIP_FILE, DESTINATION_DIRECTORY)) {
         System.out.println("Succefully unzipped to the directory "
             + DESTINATION_DIRECTORY);
        } else {
         System.out.println("There was some error during extracting archive to the directory "
             + DESTINATION_DIRECTORY);
        }
    }

 public boolean unzipToFile(String srcZipFileName,
   String destDirectoryName) {
  try {
   BufferedInputStream bufIS = null;
   // create the destination directory structure (if needed)
   File destDirectory = new File(destDirectoryName);
   destDirectory.mkdirs();

   // open archive for reading
   File file = new File(srcZipFileName);
   ZipFile zipFile = new ZipFile(file, ZipFile.OPEN_READ);

   //for every zip archive entry do
   Enumeration<? extends ZipEntry> zipFileEntries = zipFile.entries();
   while (zipFileEntries.hasMoreElements()) {
    ZipEntry entry = (ZipEntry) zipFileEntries.nextElement();
    System.out.println("\tExtracting entry: " + entry);

    //create destination file
    File destFile = new File(destDirectory, entry.getName());

    //create parent directories if needed
    File parentDestFile = destFile.getParentFile();   
    parentDestFile.mkdirs();   

    if (!entry.isDirectory()) {
     bufIS = new BufferedInputStream(
       zipFile.getInputStream(entry));
     int currentByte;

     // buffer for writing file
     byte data[] = new byte[BUFFER_SIZE];

     // write the current file to disk
     FileOutputStream fOS = new FileOutputStream(destFile);
     BufferedOutputStream bufOS = new BufferedOutputStream(fOS, BUFFER_SIZE);

     while ((currentByte = bufIS.read(data, 0, BUFFER_SIZE)) != -1) {
      bufOS.write(data, 0, currentByte);
     }

     // close BufferedOutputStream
     bufOS.flush();
     bufOS.close();

     // recursively unzip files
     if (entry.getName().toLowerCase().endsWith(ZIP_EXTENSION)) {
      String zipFilePath = destDirectory.getPath() + File.separatorChar + entry.getName();

      unzipToFile(zipFilePath, zipFilePath.substring(0,
              zipFilePath.length() - ZIP_EXTENSION.length()));
     }
    }
   }
   bufIS.close();
   return true;
  } catch (Exception e) {
   e.printStackTrace();
   return false;
  }
 }
}  

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM