java 解压zip java.lang.IllegalArgumentException: MALFORMED 错误
zip压缩包在解压过程中,遇到了错误,提示如下
java.lang.IllegalArgumentException: MALFORMED at java.util.zip.ZipCoder.toString(Unknown Source) at java.util.zip.ZipInputStream.readLOC(Unknown Source) at java.util.zip.ZipInputStream.getNextEntry(Unknown Source) at com.yc.utils.TestZip.extZipFileList(TestZip.java:40) at com.yc.utils.TestZip.main(TestZip.java:21)
查阅网上的资料,有一个说是编码的问题, ,参考了一下,确实是编码的问题。附上我的部分解压缩代码
public static void unzip(String zipFilePath, String targetPath) throws IOException { OutputStream os = null; InputStream is = null; ZipFile zipFile = null; try { zipFile = new ZipFile(zipFilePath,Charset.forName("GBK")); String directoryPath = ""; if (null == targetPath || "".equals(targetPath)) { directoryPath = zipFilePath.substring(0, zipFilePath .lastIndexOf(".")); } else { directoryPath = targetPath; } Enumeration<?> entryEnum = zipFile.entries(); if (null != entryEnum) { ZipEntry zipEntry = null; while (entryEnum.hasMoreElements()) { zipEntry = (ZipEntry) entryEnum.nextElement(); if (zipEntry.getSize() > 0) { // 文件 File targetFile = FileUtil.buildFile(directoryPath + File.separator + zipEntry.getName(), false); os = new BufferedOutputStream(new FileOutputStream(targetFile)); is = zipFile.getInputStream(zipEntry); byte[] buffer = new byte[4096]; int readLen = 0; while ((readLen = is.read(buffer, 0, 4096)) >= 0) { os.write(buffer, 0, readLen); os.flush(); } is.close(); os.close(); } if (zipEntry.isDirectory()) { String pathTemp = directoryPath + File.separator + zipEntry.getName(); File file = new File(pathTemp); file.mkdirs(); System.out.println(pathTemp); // continue; } } } } catch (IOException ex) { throw ex; } finally { if(null != zipFile){ zipFile.close(); zipFile = null; } if (null != is) { is.close(); } if (null != os) { os.close(); } } }
声明:
zipFile = new ZipFile(zipFilePath,Charset.forName("GBK"));不是所有压缩包的编码都是GBK,针对不同情况需要特殊处理。