2012-07-02 13 views
6

Zip dosyası içinde bir klasör içinde bulunan zip dosyası var lütfen bana zip giriş akışı kullanarak okumak için nasıl öneririm.zip dosyası içinde bir zip dosyası okuyun

ör .:

abc.zip 
    | 
     documents/bcd.zip 

Nasıl zip dosyası içinde bir zip dosyasını okumak için?

+1

okunmuş ne demek istiyorsunuz? bcd.zip çıkarmak istiyor musunuz? – Sujay

cevap

5

Aşağıdaki kod parçacığı, başka bir ZIP dosyasının içindeki ZIP dosyasının girişlerini listeler. İhtiyaçlarınıza göre uyarlayın. ZipFile, kaputun altında ZipInputStreams kullanır.

Kod parçacığı, Apache Commons IO, özellikle IOUtils.copy kullanır.

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<? extends ZipEntry> 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"); 
} 
+0

Harika Bu benim aradığım şey. Teşekkürler çok kardeşim –

+0

Müthiş dostum .... teşekkürler ... !!!!! – Milesh

+1

Mükemmel bir çözüm, tam olarak ne istediğimi ve kafamı saatlerce kırıyordu. Benim günümü yaptın. Çok teşekkür ederim. –

2

özyinelemeli zip dosyaları içinde zip dosyalarıyla bakmak istiyorsanız,

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

Çağrı dosyasından elde edilen dosya giriş akışı yöntemi -

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

aynı fermuarda tekrarlanıyor mu? Kullanmak yok .. – harvish

0

yazdım bir zip dosyası içinde tüm zip dosyalarını unzip bir kod. N seviyesinde sıkıştırmaya bile açılabilir. Örneğin bir fermuarın içinde bir zip dosyası varsa, bir fermuarın içinde (ve benzeri) varsa bunların tümünü çıkartabilirsiniz. Bu sınıfın zipFileExtract yöntemini kullanın ve kaynak zip dosyasını ve hedef dizini bir argüman olarak iletin.

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<File> current; 
private static List<File> 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()); 
    } 
} 

}