Создать 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());
}
}