使用Commons Compress处理加密7z文件遇报错:Stream is not in the BZip2 format
解决Commons Compress处理加密7z文件报"Stream is not in the BZip2 format"的问题
我之前也碰到过一模一样的情况——7z工具能正常打开加密归档,但用Commons Compress就抛出这个奇怪的格式异常。其实这个报错本质是解密后的流不符合预期格式,大概率是库版本或密码编码的问题,给你几个靠谱的解决方向:
1. 升级Commons Compress到最新稳定版
旧版本的Commons Compress对加密7z的支持有不少bug,尤其是对某些压缩算法的解密逻辑处理不完善。比如1.20及更早的版本,在处理加密的LZMA2压缩7z时就容易出现这类解析错误。
如果用Maven,直接更新依赖到最新版(比如当前最新稳定版是1.26.0):
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-compress</artifactId> <version>1.26.0</version> </dependency>
Gradle的话:
implementation 'org.apache.commons:commons-compress:1.26.0'
2. 显式指定密码的UTF-8编码
你的代码里用了"secret".getBytes(),这会使用平台默认编码(比如Windows上是GBK),但7z工具默认是用UTF-8编码存储密码的。编码不匹配会导致解密失败,解密后的流自然不是合法的压缩格式,就会抛出"Stream is not in the BZip2 format"的错误。
修正代码,显式用UTF-8编码密码:
import java.nio.charset.StandardCharsets; // ... byte[] PASSWORD = "secret".getBytes(StandardCharsets.UTF_8);
3. 检查7z文件的压缩算法(兜底排查)
如果上面两步都没用,打开7z工具,右键你的归档文件→「属性」→「7z」标签页,查看压缩方法。如果用了Commons Compress暂不支持的算法(比如PPMd),那要么重新用支持的算法(比如LZMA2、BZip2)压缩文件,要么等待Commons Compress更新支持。不过这种情况比较少见,大部分场景前两步就能解决问题。
按上面的步骤调整后,再运行你的代码,应该就能正常遍历7z里的条目了。
内容的提问来源于stack exchange,提问作者Cromax
相关产品推荐
相关产品推荐

