Java解压Ubuntu生成的7z文件报CorruptedInputException错误如何解决
问题根因
该问题和Ubuntu操作系统本身无关,是Ubuntu默认预装的p7zip压缩工具生成7z包时的默认参数,与你当前使用的commons-compress 1.21、xz 1.9版本的7z格式解析逻辑不兼容导致的。你本地生成的7z包本身没有损坏,只是用到了旧版本commons-compress不支持的7z特性(比如过大的LZMA2字典、默认开启的固实压缩特殊标记、BCJ过滤器等)。
修复方案
方案1:调整Ubuntu下7z包的生成参数
打包时指定兼容旧版commons-compress的参数,命令如下:
7z a -t7z -m0=lzma -mx=5 -mfb=64 -md=32m -ms=off 目标压缩包名.7z 待压缩的文件/目录
参数说明:
-ms=off:关闭固实压缩,避免旧版commons-compress解析固实包头出错-md=32m:限制压缩字典大小为32M,避免超出xz库的默认解析阈值-m0=lzma:指定使用LZMA算法压缩,避免默认LZMA2的兼容性问题
方案2:升级依赖版本
将你的依赖升级到最新稳定版即可解决大部分兼容性问题:
- commons-compress升级到1.26及以上版本
- xz升级到1.10及以上版本
高版本的commons-compress已经适配了Ubuntu默认p7zip生成的绝大多数7z包格式。
方案3:优化现有代码
你当前的代码不需要手动读取全量字节数组构造通道,直接使用SevenZFile的File构造方法即可,既可以避免大文件OOM问题,也能排除手动处理流引入的潜在异常:
File f = new File("/home/local/Documents/7zFile/7zFile.7z"); try (SevenZFile sevenZFile = new SevenZFile(f)) { SevenZArchiveEntry entry; while ((entry = sevenZFile.getNextEntry()) != null) { System.out.print(entry.getName()); } } catch (IOException e) { e.printStackTrace(); }
验证步骤
执行以下命令确认你本地生成的7z包本身无损坏:
7z t /home/local/Documents/7zFile/7zFile.7z
如果命令输出Everything is Ok,就可以确认压缩包本身正常,按上述方案调整即可。
内容的提问来源于stack exchange,提问作者user3629
相关产品推荐
相关产品推荐

