Java解壓zip檔案(支援中文字元檔案)
阿新 • • 發佈:2019-02-02
昨天接到了一個解壓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,一切正常。
希望對大家有所幫助!!