How to unzip files recursively in Java?

后端 未结 9 2043
慢半拍i
慢半拍i 2020-11-27 03:10

I have zip file which contains some other zip files.

For example, the mail file is abc.zip and it contains xyz.zip, class1.java

9条回答
  •  -上瘾入骨i
    2020-11-27 03:27

    Here is some code, which I tested to be working quite well :

    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 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;
      }
     } 
    }  
    

    I tried with the top voted answer here, and that does not recursively unzip the files, it just unzips the files of the first level.

    Source : Solution which extracts files into a given directory

    Also, check this solution by the same person : Solution which extracts file in memory

提交回复
热议问题