Java中如何从二进制数据重建Zip文件(无需知晓内部内容)
解决方案
你完全不需要使用ZipOutputStream来处理,因为你从消息队列接收的二进制数据本身就是完整的Zip文件,直接把这些字节写入本地文件就能得到可正常解压的Zip文件。
之前的错误在于,你把整个Zip文件的原始数据当成了单个文件的内容,试图用ZipOutputStream重新打包——这相当于把一个Zip文件又塞进了另一个Zip文件的条目里,自然会生成无效文件。
正确代码示例
小数据量场景(直接用字节数组)
byte[] data = {}; // 从消息队列接收的完整Zip二进制数据 FileOutputStream fos = new FileOutputStream(new File("ZipFile.zip")); fos.write(data); fos.close();
大数据量场景(流式分块写入,避免内存溢出)
InputStream inputStream = ...; // 从消息队列获取的输入流(替代byte[]) FileOutputStream fos = new FileOutputStream(new File("ZipFile.zip")); byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { fos.write(buffer, 0, bytesRead); } fos.close(); inputStream.close();
错误原因说明
ZipOutputStream的作用是创建新的Zip文件,需要你逐个添加Zip条目(文件/文件夹)并写入对应内容。而你拿到的data已经是打包完成的Zip文件,包含了所有条目信息、文件内容和Zip文件的结构标识,直接写入文件系统就能被系统识别为合法的Zip文件。
内容的提问来源于stack exchange,提问作者Chaitnya Joshi
相关产品推荐
相关产品推荐

