Добавить JarOutputStream в ZipOutputStream

#java #outputstream #zipoutputstream

#java #outputstream #zipoutputstream

Вопрос:

в настоящее время я сгенерировал JarOutputStream и каталог, заполненный файлами *.java.

Я хочу добавить конечный JarOutputStream в ZipOutputStream, чтобы вернуть конечный файл *.zip с каталогом и файлом *.jar.

Теперь я хотел знать, как и могу ли я добавить JarOutputStream в ZipOutputStream.

Большое спасибо!

Комментарии:

1. Вы не можете этого сделать — это не будет работать правильно. Причина в том, что ZIP и JAR (файл JAR по сути является ZIP-файлом с другим расширением) сжимают необработанные данные в файлах, которые вы в них помещаете. Таким образом, вы можете отправлять содержимое ZIP-файла в JarOutputStream и наоборот. Но сначала вы должны создать файл (хотя вы могли бы просто создать файл в буфере памяти)

Ответ №1:

Я не уверен, что вы на самом деле имеете в виду, говоря «Я сгенерировал 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 ...
     */
    
  }
}