为何7-zip无法解压Python zlib.compress()压缩的文件?Java流也不识别?
问题原因
- 核心问题是混淆了原始压缩数据流和归档封装格式的概念:Python
zlib.compress()输出的是仅包含DEFLATE压缩算法生成的压缩字节流,仅携带压缩后的载荷数据,没有任何归档格式要求的文件标识头、元数据、校验和、文件目录结构等封装信息。 - 你当前使用的所有解压工具都是针对特定归档格式设计的,格式校验规则不匹配:
- 7-Zip的ZIP解压逻辑、Java
ZipInputStream要求输入符合ZIP归档格式规范,需要有0x504B开头的文件头、中央目录等固定结构 - Java
GZIPInputStream要求输入符合GZIP格式规范,需要有0x1F8B开头的GZIP头、尾校验和等固定结构
- 7-Zip的ZIP解压逻辑、Java
- 直接保存zlib原始流为
.zip文件,本质是文件后缀名和实际内容完全不匹配,所有格式校验都会直接失败,也就是报错信息里的Is not archive。
解决方案
根据你的实际使用场景,可选择以下任意一种适配方案:
场景1:需要生成标准ZIP归档,兼容7-Zip、Java ZipInputStream
不要直接使用zlib做压缩,改用Python内置的zipfile模块处理,示例代码如下:
from tempfile import gettempdir from zipfile import ZipFile, ZIP_DEFLATED from subprocess import run filename = r"testCompress.py" zipname = gettempdir() + r"\zipped.zip" unzip = r'"C:\Program Files\7-Zip\7z.exe" x ' + zipname # 生成符合规范的ZIP归档 with ZipFile(zipname, 'w', ZIP_DEFLATED) as zipf: zipf.write(filename) # 调用7zip解压可以正常执行 print("now unzipping on cmd level") run(unzip, shell=True)
场景2:需要生成标准GZIP格式,兼容Java GZIPInputStream
改用Python内置的gzip模块处理,示例代码如下:
from tempfile import gettempdir import gzip from subprocess import run filename = r"testCompress.py" gzipname = gettempdir() + r"\zipped.gz" # 7-zip也可以直接解压gz格式文件 unzip = r'"C:\Program Files\7-Zip\7z.exe" x ' + gzipname with open(filename,"r") as f: text = f.read() b = bytes(text,"ascii") # 生成符合规范的GZIP格式文件 with gzip.open(gzipname, "wb") as f: f.write(b) print("now unzipping on cmd level") run(unzip, shell=True)
场景3:必须直接使用zlib.compress()生成的原始流
在Java端不要使用GZIPInputStream或ZipInputStream,改用InflaterInputStream,它原生支持zlib格式的原始流解压,示例代码如下:
import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.zip.InflaterInputStream; public class DecompressZlib { public static void main(String[] args) throws Exception { FileInputStream fis = new FileInputStream("你的zlib压缩文件本地路径"); InflaterInputStream iis = new InflaterInputStream(fis); FileOutputStream fos = new FileOutputStream("解压后文件输出路径"); byte[] buffer = new byte[1024]; int len; while ((len = iis.read(buffer)) > 0) { fos.write(buffer, 0, len); } fos.close(); iis.close(); fis.close(); } }
内容的提问来源于stack exchange,提问作者ngong
相关产品推荐
相关产品推荐

