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