javaoutputstreamzipoutputstream

Add JarOutputStream to ZipOutputStream


currently I have generated a JarOutputStream and a Directory filled with *.java files.

I want to add the final JarOutputStream to a ZipOutputStream to return a final *.zip file with the directory and the *.jar file.

Now I wanted to know, how and if I can add JarOutputStream to a ZipOutputStream.

Thanks alot!


Solution

  • I'm not sure what you actually mean with "I have generated a JarOutputStream". But if you want to write content to a JAR file that is then written to a ZIP file, without the need to hold everything in memory, you could do this the following way:

    public static class ExtZipOutputStream extends ZipOutputStream {
    
      public ExtZipOutputStream(OutputStream out) {
        super(out);
      }
    
      public JarOutputStream putJarFile(String name) throws IOException {
        ZipEntry zipEntry = new ZipEntry(name);
        putNextEntry(zipEntry);
        return new JarOutputStream(this) {
    
          @Override
          public void close() throws IOException {
            /* IMPORTANT: We finish writing the contents of the ZIP output stream but do 
             * NOT close the underlying ExtZipOutputStream
             */
            super.finish();
            ExtZipOutputStream.this.closeEntry();
          }
        };
      }
    }
    
    public static void main(String[] args) throws FileNotFoundException, IOException {
    
      try (ExtZipOutputStream zos = new ExtZipOutputStream(new FileOutputStream("target.zip"))) {
        
        try (JarOutputStream jout = zos.putJarFile("embed.jar")) {
          /*
           * Add files to embedded JAR file here ...
           */
        }
        
        /*
         * Add additional files to ZIP file here ...
         */
        
      }
    }