从现有的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()); } }
- Apache commons fileupload FileItemIterator hasNext()返回false
- 使用Linux上的Apache Commons Compression压缩文件时编码错误
- 是否有StringUtils.isNumeric的替代方法,我的意思是什么?
- 如何将字符串参数传递给使用Apache Commons Exec启动的可执行文件?
- 加速Apache Commons FTPClient传输
- 使用org.apache.commons.net.ftp.FTPClient保护FTP
- 我何时应该使用Apache Commons的Validate.isTrue,何时应该使用’assert’关键字?
- 反序列化会话数据时出现InvalidClassException错误
- 将Java Bean展平为地图