简体   繁体   English

如何在Java中的zip文件中解压缩zip文件

[英]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. 我使用下面的代码来毫无问题地提取zip文件的内容。 Recently I got a requirement to unzip a zip file located within a zip file and have struggled to get the processing logic correct. 最近,我需要解压缩位于zip文件中的zip文件,并且一直在努力使处理逻辑正确无误。 I invision on routine that will read through a zip file and fill an array of all files containing .log in them. 我对例程进行了说明,该例程将读取一个zip文件并填充所有包含.log的文件的数组。 My challenge is how to have the routine call itself when another zip file is located. 我的挑战是,当找到另一个zip文件时,如何让例程本身进行调用。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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