您正在将新zip文件的ZipEntry设置为与原始文件中的实例相同的实例.这意味着所有值都必须匹配,但是如果写入的条目的压缩大小与源文件的压缩大小不匹配,则失败.原始压缩代码与您现在使用的压缩代码之间的细微差别将产生不同的压缩大小.要使其运行,您必须为输出创建ZipEntry的副本并重置其压缩大小.
顺便说一句,您在代码中使用zin.getNextEntry()和zf.getInputStream(ze),这意味着您正在同时使用ZipFile和ZipInputStream.如果他们引用同一个文件,那将浪费资源,如果他们引用不同的文件,则可能会遇到更多问题.
确定任一ZipFile
ZipFile zf = …
ZipOutputStream zos = …
byte[] buffer = …
for(Enumeration extends ZipEntry> e=zf.entries(); e.hasMoreElements();) {
ZipEntry ze = e.nextElement();
InputStream is = zf.getInputStream(ze);
ZipEntry zeOut=new ZipEntry(ze);
zeOut.setCompressedSize(-1);
zos.putNextEntry(zeOut);
int len;
while ((len = is.read(buffer)) >= 0) {
zos.write(buffer, 0, len);
}
zos.closeEntry();
}
zos.close();
zf.close();
或ZipInputStream
ZipInputStream zin…
ZipOutputStream zos=…
byte[] buffer = …
ZipEntry ze = zin.getNextEntry();
while (ze != null) {
ZipEntry zeOut=new ZipEntry(ze);
zeOut.setCompressedSize(-1);
zos.putNextEntry(zeOut);
int len;
while ((len = zin.read(buffer)) >= 0) {
zos.write(buffer, 0, len);
}
zos.closeEntry();
ze = zin.getNextEntry();
}
zos.close();
zin.close();