1. 程式人生 > >Java操作Zip壓縮檔案遇到的編碼問題

Java操作Zip壓縮檔案遇到的編碼問題

Exception in thread "main" java.lang.IllegalArgumentException: MALFORMED
at java.util.zip.ZipCoder.toString(ZipCoder.java:58)
at java.util.zip.ZipInputStream.readLOC(ZipInputStream.java:297)
at java.util.zip.ZipInputStream.getNextEntry(ZipInputStream.java:121)
at com.forestfood.FileUntils.done(FileUntils.java
:224) at com.forestfood.FileUntils.getActionZipFiles(FileUntils.java:196) at com.forestfood.FileUntils.main(FileUntils.java:24)

2、查詢原因:追查報錯程式碼行至  ZipCoder.java:58

final class ZipCoder {
    String toString(byte[] ba, int length) {
        CharsetDecoder cd = decoder().reset();
        int len = (int
)(length * cd.maxCharsPerByte());         char[] ca = new char[len];         if (len == 0)             return new String(ca);         // UTF-8 only for now. Other ArrayDeocder only handles// CodingErrorAction.REPLACE mode. ZipCoder uses// REPORT mode.if (isUTF8 && cd instanceof ArrayDecoder) {             int
 clen = ((ArrayDecoder)cd).decode(ba, 0, length, ca);             if (clen == -1)    // malformedthrow new IllegalArgumentException("MALFORMED");             return new String(ca, 0, clen);         }

可以發現,如果不指定編碼的時候,預設是UTF-8,在解碼的時候就會發生錯誤。

3、解決方法:在建立zip的時候,指定編碼

FileInputStream fileInputStream = new FileInputStream(zipPath);
Charset gbk = Charset.forName("gbk");
ZipInputStream zin = new ZipInputStream(fileInputStream,gbk);
ZipEntry entry = zin.getNextEntry();