Come posso aggiungere voci a un file zip esistente in Java?

Possibile duplicato:
Aggiunta di file in un file zip con Java

L’apertura del file con ZipOutputStream lo sovrascrive. C’è un modo per mantenere il file e basta aggiungere nuove voci?

La funzione rinomina il file zip esistente in un file temporaneo e quindi aggiunge tutte le voci nel file zip esistente insieme ai nuovi file, escludendo le voci zip che hanno lo stesso nome di uno dei nuovi file.

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

È ansible utilizzare zipFile.entries () per ottenere un’enumerazione di tutti gli oggetti ZipEntry nel file esistente, eseguirne il ciclo e aggiungerli tutti a ZipOutputStream, quindi aggiungere le nuove voci in aggiunta.

Ecco un articolo dettagliato di JavaWorld sulla modifica degli archivi zip.

Devi essere sicuro di aggiungere un CRC32 per i file non compressi aggiunti a uno zip. Guarda l’esempio qui. http://jcsnippets.atspace.com/java/input-output/create-zip-file.html


Puoi farlo in modo semplice, senza riscrivere tutto, con Zip4j. Qui mostra: http://blog.michalszalkowski.com/java/zip4j-add-file-to-existing-zip-file/

E puoi farlo anche con ZipOutputStream di Zip4J, usando SplitOutputStream insieme.

  net.lingala.zip4j zip4j 1.3.1  

ex:

 ZipFile zipFile = new ZipFile(new File("/home/szalek/zip/core1.zip")); ArrayList filesToAdd = new ArrayList(); filesToAdd.add(new File("/home/szalek/zip/someData.txt")); ZipParameters parameters = new ZipParameters(); parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE); parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL); //password parameters.setEncryptFiles(true); parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD); parameters.setPassword("test123!"); //password zipFile.addFiles(filesToAdd, parameters);