1. 程式人生 > >Java解壓zip檔案(支援中文字元檔案)

Java解壓zip檔案(支援中文字元檔案)

昨天接到了一個解壓zip檔案的任務,所以今天在做任務之前,便寫demo試了一下,
部分思路參考自:這裡
貼上程式碼:

public void Decompressing2() throws IOException {
        String path = "E:\\zipTest";
        ZipEntry zipEntry = null;
        try (
                // ZipInputStream讀取壓縮檔案
                ZipInputStream zipInputStream = new ZipInputStream(new
FileInputStream(path + "\\toefl.zip"),Charset.forName("GBK")); // 寫入到緩衝流中 BufferedInputStream bufferedInputStream = new BufferedInputStream(zipInputStream);){ File fileOut = null; // 讀取壓縮檔案中的一個檔案 while ((zipEntry = zipInputStream.getNextEntry()) != null
) { // 若當前zipEntry是一個資料夾 if (zipEntry.isDirectory()) { fileOut = new File(path + "//" +zipEntry.getName()); // 在指定路徑下建立資料夾 if (!fileOut.exists()) { fileOut.mkdirs(); } //若是檔案
} else { // 原檔名與指定路徑建立File物件(解壓後文件的物件) fileOut = new File(path, zipEntry.getName()); try( FileOutputStream fileOutputStream = new FileOutputStream(fileOut); BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);){ //將檔案寫入到指定file中 int b = 0; while ((b = bufferedInputStream.read()) != -1) { bufferedOutputStream.write(b); } }catch (Exception e) { e.printStackTrace(); } } } } catch (Exception e) { e.printStackTrace(); } }

在測試中發現,若壓縮包中包含漢字會跑出異常!
異常如下:

檢視原始碼發現:ZipInputStream物件有兩個構造方法
這裡寫圖片描述

發現其預設構造方法的CharSet對utf8格式:StandardCharsets.UTF_8

所以用ISO-8859-1試了一下
ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(path + "/tpo40.zip"),StandardCharsets.ISO_8859_1);
結果如下:
這裡寫圖片描述

開啟解壓後的檔案:
這裡寫圖片描述

解壓後文件很正常(沒有中文字元),但是資料夾名字亂碼

後打算用GBK試一下:

檢視StandardCharsets原始碼:
這裡寫圖片描述
並沒有GBK這個常量,但是 其成員的宣告方法是:Charset.forName(“xxxx”)的方式。
所以採用如下方式建立ZipInputStream物件:

ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(path + "\\toefl.zip"),Charset.forName("GBK"));

解壓後OK,一切正常。
希望對大家有所幫助!!