Java.util.zip replace a single zip file

user1647794 picture user1647794 · Dec 9, 2012 · Viewed 8.6k times · Source

Problem

I have an existing zipfile "main.zip". I want to replace a single file in it, "say main.zip/foo."

I am aware of:

http://docs.oracle.com/javase/7/docs/api/java/util/zip/ZipOutputStream.html

However, this does not do what I want, as it creates a new Zip file -- and thus I'd have to add in all the existing entries in main.zip also.

Question:

Is there a way to "replace" a single file within a Zip archive in Java? (Without re-creating a new zip archive and copying over all the old data).

Answer

Aksel Willgert picture Aksel Willgert · Dec 9, 2012

I think you are in luck.

Using the java 7 java.nio.file.FileSystem together with Files.copy() I managed to insert a textfile into a large zipfile in a split second.

public static void main(String[] argv) {
    Path myFilePath = Paths.get("c:/dump2/mytextfile.txt");

    Path zipFilePath = Paths.get("c:/dump2/myarchive.zip");
    try( FileSystem fs = FileSystems.newFileSystem(zipFilePath, null) ){
        Path fileInsideZipPath = fs.getPath("/mytextfile.txt");
        Files.copy(myFilePath, fileInsideZipPath);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

It 'mounts' the zip using the ZipFileSystem Provider. Then you can just copy whatever you want into it. The changes seem to take place on fs.close()

Read more @ oracle