我遇到了java.util.zip的奇怪行为.*
我有一个zip文件,在解压缩后会发生这种情况
ZipFile zipfile = new ZipFile(file, ZipFile.OPEN_READ);
Run Code Online (Sandbox Code Playgroud)
这是exaxt错误消息
java.util.zip.ZipException: error in opening zip file
at java.util.zip.ZipFile.open(Native Method)
at java.util.zip.ZipFile.<init>(ZipFile.java:127)
at java.util.zip.ZipFile.<init>(ZipFile.java:143)
at com.basware.ExtractZip.unpack(ExtractZip.java:27)
at com.basware.ExtractZip.main(ExtractZip.java:17)
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用以下代码,它可以打开存档而不会出现任何错误
try {
BufferedOutputStream dest = null;
File file = new File("File_Path");
FileInputStream fis = new FileInputStream(file);
ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis));
ZipEntry entry;
while((entry = zis.getNextEntry()) != null) {
System.out.println("Extracting: " +entry);
int count;
byte data[] = new byte[BUFFER];
// write the files to the disk
FileOutputStream fos = new
FileOutputStream(entry.getName());
dest = new
BufferedOutputStream(fos, BUFFER);
while ((count = zis.read(data, 0, BUFFER))
!= -1) {
dest.write(data, 0, count);
}
dest.flush();
dest.close();
}
zis.close();
Run Code Online (Sandbox Code Playgroud)
请注意,使用WinZIP压缩文件.
我的问题是ZipFile和ZipInputStream几乎相同,为什么ZipFile给出异常以及为什么它无法执行解压缩.
编辑:问题是如果我使用WinZip工具压缩文件,然后使用列出的程序解压缩它工作正常.但是,这个问题是专门针对来自外部源的归档(外部来源声称他们正在使用WinZip).On最重要的是,如果我使用WinZip工具打开相同的存档(外部存档),它会显示和解压缩文件.但是这个JAVA特定代码(ZipFile)根本不起作用.
编辑:我无法弄清楚为什么java本机代码不能用于我的ZIP存档,但apache压缩解决了我的问题.它正在为我工作,如Ian Roberts所建议的.
ZipFile尝试解析 zip 末尾的“中心目录”,以构建允许您按名称访问各个条目的数据结构。ZipInputStream不是,它在从上到下读取文件时只查看每个条目的本地标头。因此,您的文件似乎具有良好的条目,但由于某种原因损坏了中央目录。
存在多种可能性,例如条目名称中非 ASCII 字符的编码问题,或者 zip 条目是否超过 64k。我会尝试ZipFile 的commons-compress实现 - 即使它不起作用,它也应该为您提供比从 java.util.zip 获得的“出了问题”更具体的错误消息。