2010-06-15 1 views

Antwort

4

Sie können zipFile.entries() verwenden, um eine Auflistung aller ZipEntry-Objekte in der vorhandenen Datei abzurufen, sie durchzuschleifen und sie alle zum ZipOutputStream hinzuzufügen und anschließend Ihre neuen Einträge hinzuzufügen.

15

Die Funktion benennt die vorhandene Zip-Datei in eine temporäre Datei um und fügt dann alle Einträge in der vorhandenen Zip-Datei zusammen mit den neuen Dateien hinzu, mit Ausnahme der Zip-Einträge, die denselben Namen wie eine der neuen Dateien haben.

public static void addFilesToExistingZip(File zipFile, 
     File[] files) throws IOException { 
     // get a temp file 
    File tempFile = File.createTempFile(zipFile.getName(), null); 
     // delete it, otherwise you cannot rename your existing zip to it. 
    tempFile.delete(); 

    boolean renameOk=zipFile.renameTo(tempFile); 
    if (!renameOk) 
    { 
     throw new RuntimeException("could not rename the file "+zipFile.getAbsolutePath()+" to "+tempFile.getAbsolutePath()); 
    } 
    byte[] buf = new byte[1024]; 

    ZipInputStream zin = new ZipInputStream(new FileInputStream(tempFile)); 
    ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFile)); 

    ZipEntry entry = zin.getNextEntry(); 
    while (entry != null) { 
     String name = entry.getName(); 
     boolean notInFiles = true; 
     for (File f : files) { 
      if (f.getName().equals(name)) { 
       notInFiles = false; 
       break; 
      } 
     } 
     if (notInFiles) { 
      // Add ZIP entry to output stream. 
      out.putNextEntry(new ZipEntry(name)); 
      // Transfer bytes from the ZIP file to the output file 
      int len; 
      while ((len = zin.read(buf)) > 0) { 
       out.write(buf, 0, len); 
      } 
     } 
     entry = zin.getNextEntry(); 
    } 
    // Close the streams   
    zin.close(); 
    // Compress the files 
    for (int i = 0; i < files.length; i++) { 
     InputStream in = new FileInputStream(files[i]); 
     // Add ZIP entry to output stream. 
     out.putNextEntry(new ZipEntry(files[i].getName())); 
     // Transfer bytes from the file to the ZIP file 
     int len; 
     while ((len = in.read(buf)) > 0) { 
      out.write(buf, 0, len); 
     } 
     // Complete the entry 
     out.closeEntry(); 
     in.close(); 
    } 
    // Complete the ZIP file 
    out.close(); 
    tempFile.delete(); 
}