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

时间:2010-10-25 16:40:09

标签: java apache-commons

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

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

我想创建一个

java.util.zip.ZipOutputStream 

apache.commons.ZipArchiveOutputStream

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

4 个答案:

答案 0 :(得分:7)

是的,这绝对是可能的!

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

ZipOutputStream可以在任何地方发送,因为它的构造函数只需要OutputStream,因此可以是你的HTTP响应。

答案 1 :(得分:3)

这样的事情会起作用:

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

答案 2 :(得分:0)

输入: 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();
                           }
                                       }
                       }

答案 3 :(得分:0)

使用TS Playground snippet

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

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());
    }
}