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

时间:2014-07-18 05:20:04

标签: java

我使用下面的代码来解压缩zip文件的内容而没有任何问题。最近我要求解压缩位于zip文件中的zip文件并且努力使处理逻辑正确。我在例行程序上查看将读取zip文件并填充包含.log的所有文件的数组。我的挑战是如何在找到另一个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
            }

1 个答案:

答案 0 :(得分:1)

This是递归解压缩压缩文件的方法。

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