从现有OutputStream创建Java Zip存档

从现有OutputStream创建Java Zip存档,java,apache-commons,Java,Apache Commons,如果我不想将生成的归档文件写入磁盘,而是将其发送到其他地方,是否可以用Java创建Zip归档文件 其想法是,当您希望通过HTTP(例如,从数据库Blob或任何其他数据存储)将Zip存档发送给用户时,在磁盘上创建文件可能是一种浪费 我想创建一个 java.util.zip.ZipOutputStream 或者 如果Feeder是来自Subversion存储库的ByteArrayOutputStream,则这是绝对可能的 使用ZipOutputStream上的putNextEntry方法创建Zi

如果我不想将生成的归档文件写入磁盘,而是将其发送到其他地方,是否可以用Java创建Zip归档文件

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

我想创建一个

java.util.zip.ZipOutputStream 
或者


如果Feeder是来自Subversion存储库的ByteArrayOutputStream,则这是绝对可能的

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


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(有两个文件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();
                           }
                                       }
                       }
使用:


好了,成功了!但是如何创建实际包含文件本身的目录呢?现在我得到了所有文件,很好,但是目录在根节点中被解压为零字节长度的文件,因此根本没有层次结构:-(ZIP文件只包含一个简单的文件列表。但是,文件名可能包含路径信息。只需添加一个名为
dir/file.txt
ZipEntry
:即
file.txt
目录中的
dir
。是的,通过添加绝对URL,一切正常。非常感谢!
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();
                           }
                                       }
                       }
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-compress</artifactId>
    <version>1.16.1</version>
 </dependency>
try (ZipArchiveInputStream zis = new ZipArchiveInputStream(
         new ByteArrayInputStream(bytes), "UTF8", false, true)) {
    ZipArchiveEntry ze;
    while ((ze = zis.getNextZipEntry()) != null) {
        log.info(ze.getName());
    }
}