如何复现java.util.zip.ZipException: ZIP_Read: error reading zip file异常?
复现
java.util.zip.ZipException: ZIP_Read: error reading zip file的可行方法 嘿,我来帮你搞定这个异常复现的问题!要触发这个特定的ZIP读取异常,其实有好几种实操性很强的方法,我给你逐一拆解:
手动破坏ZIP文件头
正常的ZIP/JAR文件开头都是固定的字节序列PK\x03\x04(十六进制是50 4B 03 04)。你可以用任意支持二进制编辑的工具(比如Notepad++的二进制编辑模式)打开一个正常的ZIP/JAR文件,把开头的几个字节改成乱码(比如改成XX\x03\x04),保存后用Java代码尝试读取这个文件,大概率会触发目标异常。截断ZIP文件至不完整状态
用系统工具把正常的ZIP/JAR文件截短,让它变成一个不完整的压缩包:- Linux/macOS下执行命令:
truncate -s 100 your-corrupted-file.zip(把文件大小强行改成100字节,远小于原文件) - Windows下执行命令:
fsutil file seteof your-corrupted-file.zip 100
之后用Java的ZipFile或ZipInputStream读取这个截断后的文件,就会因为无法读取完整的压缩结构而抛出异常。
- Linux/macOS下执行命令:
在ZIP文件末尾添加无效数据
找一个正常的ZIP/JAR文件,用文本编辑器打开后在末尾粘贴一段乱码文本(或者随便复制其他文件的内容),保存后再用Java读取。当ZIP解析器读完正常结构后遇到无效数据,就会触发读取错误。修改压缩条目的内容
先创建一个包含多个文件的ZIP包,然后用二进制编辑器找到其中一个压缩条目的数据段,随便修改几个字节(比如把连续的几个0改成FF)。当Java尝试解压这个被篡改的条目时,就会因为数据校验失败或格式错误抛出目标异常。
示例Java测试代码
你可以用这段代码来测试上述损坏的文件:
import java.io.File; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; public class CorruptedZipTest { public static void main(String[] args) { File corruptedFile = new File("your-corrupted-file.zip"); try (ZipFile zipFile = new ZipFile(corruptedFile)) { // 遍历所有条目,触发读取操作 for (ZipEntry entry : zipFile.stream().toList()) { System.out.println("Reading entry: " + entry.getName()); // 尝试打开输入流,触发解压读取 zipFile.getInputStream(entry); } } catch (Exception e) { e.printStackTrace(); } } }
注意:不同Java版本的异常信息可能略有差异,但ZIP_Read: error reading zip file这个异常通常是在底层读取遇到IO错误或严重格式损坏时抛出的,上述方法基本都能触发这个异常。
内容的提问来源于stack exchange,提问作者gonzo33
相关产品推荐
相关产品推荐

