从现有的OutputStream创建Java-Zip-Archive

如果我不想将生成的存档写入磁盘但是将其发送到其他地方,是否可以在Java中创建Zip-Archive?

想法是,当您想要通过HTTP(例如,从Database-Blob或任何其他数据存储)向用户发送Zip-Archive时,在磁盘上创建文件可能是浪费。

我想创建一个

java.util.zip.ZipOutputStream 

或者a

 apache.commons.ZipArchiveOutputStream 

Feeder将是来自我的Subversion存储库的ByteArrayOutputStream

是的,这绝对是可能的!

使用putNextEntry上的putNextEntry方法创建Zip条目,然后通过在putNextEntry上调用write将字节放入zip文件中。 对于该方法的参数, byte[]只是通过其toByteArray方法从ByteArrayOutputStream提取它们。

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 :

  org.apache.commons commons-compress 1.16.1  

byte[] bytes读取zip示例:

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