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,針對不同情況需要特殊處理。