Создать Java-Zip-архив из существующего OutputStream - PullRequest
6 голосов
/ 25 октября 2010

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

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

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

java.util.zip.ZipOutputStream 

или

apache.commons.ZipArchiveOutputStream

, где Feeder будет ByteArrayOutputStream, поступающий из моего хранилища Subversion

Ответы [ 4 ]

7 голосов
/ 25 октября 2010

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

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

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

3 голосов
/ 25 октября 2010

Нечто подобное будет работать:

ZipOutputStream zs = new ZipOutputStream(outputStream) ;
ZipEntry e = new ZipEntry(fileName);
zs.putNextEntry(e);
zs.write(...);
zs.close();
0 голосов
/ 27 марта 2018

Использование 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());
    }
}
0 голосов
/ 08 мая 2015

Ввод: 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();
                           }
                                       }
                       }
...