从现有OutputStream创建Java Zip存档
如果我不想将生成的归档文件写入磁盘,而是将其发送到其他地方,是否可以用Java创建Zip归档文件 其想法是,当您希望通过HTTP(例如,从数据库Blob或任何其他数据存储)将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.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());
}
}