Создать Java-Zip-архив из существующего OutputStream

можно ли создать Zip-архив на Java, если я не хочу записывать полученный архив на диск, но отправлять его куда-то еще?

идея в том, что создание файла на диске, когда вы хотите отправить Zip-архив пользователю через HTTP (например, из базы данных-Blob или любого другого хранилища данных), может быть пустой тратой времени.

Я хотел бы создать

java.util.zip.ZipOutputStream 

или

apache.commons.ZipArchiveOutputStream

где Фидер был бы ByteArrayOutputStream приходя от мой репозиторий Subversion

4 ответов


Да, это абсолютно возможно!

создайте запись Zip с помощью putNextEntry метод ZipOutputStream затем поместите байты в файл в zip, вызвав write на ZipOutputStream. Для параметра для этого метода byte[], просто извлеките их из ByteArrayOutputStream С toByteArray метод.

и ZipOutputStream может быть отправлен в любом месте, так как его конструктор просто принимает OutputStream так может быть, например, ваш HTTP-ответ.


что-то вроде этого будет работать:

ZipOutputStream zs = new ZipOutputStream(outputStream) ;
ZipEntry e = new ZipEntry(fileName);
zs.putNextEntry(e);
zs.write(...);
zs.close();

вход: D:/in.в XML

выход: D:/final.zip (с 2 файлами 001zip.txt, 002zip.txt)

код:

package com.stackoverflow.filezip;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class fileZip {

public static void main(String[] args) {

    try {
InputStream in = new FileInputStream("D:/in.xml");
OutputStream out=   new FileOutputStream("D:/final.zip");
ZipOutputStream zs = new ZipOutputStream(out);

            ZipEntry e1 = new ZipEntry("001zip.txt");
            ZipEntry e2 = new ZipEntry("002zip.txt");
            zs.putNextEntry(e1);
            zs.write("test content in file1".getBytes());
            zs.putNextEntry(e2);
            zs.write("test content in file2".getBytes());

            zs.close();
       }
       catch (Exception e) {
            e.printStackTrace();
                           }
                                       }
                       }

использовать Apache Commons Compress:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-compress</artifactId>
    <version>1.16.1</version>
 </dependency>

читать zip из byte[] bytes пример:

try (ZipArchiveInputStream zis = new ZipArchiveInputStream(
         new ByteArrayInputStream(bytes), "UTF8", false, true)) {
    ZipArchiveEntry ze;
    while ((ze = zis.getNextZipEntry()) != null) {
        log.info(ze.getName());
    }
}