将 JarOutputStream 添加到 ZipOutputStream

Add JarOutputStream to ZipOutputStream

目前我已经生成了一个 JarOutputStream 和一个包含 *.java 个文件的目录。

我想将最终的 JarOutputStream 添加到 ZipOutputStream 到 return 包含目录和 *.jar 文件的最终 *.zip 文件。

现在我想知道如何以及是否可以将 JarOutputStream 添加到 ZipOutputStream。

非常感谢!

我不确定您所说的“我生成了 JarOutputStream”是什么意思。但是如果你想将内容写入一个 JAR 文件,然后再写入一个 ZIP 文件,而不需要将所有内容都保存在内存中,你可以按以下方式执行此操作:

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 ...
     */
    
  }
}