如果我不想将生成的存档写入磁盘但是将其发送到其他地方,是否可以在Java中创建Zip-Archive?
想法是,当您想通过HTTP将Zip-Archive发送给用户时(例如,从Database-Blob或任何其他数据存储中),在磁盘上创建文件可能是浪费。
我想创建一个
java.util.zip.ZipOutputStream
或
apache.commons.ZipArchiveOutputStream
其中Feeder将是来自我的Subversion存储库的ByteArrayOutputStream
答案 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)
<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());
}
}