java解壓zip文件,處理文件名不能爲中文



1、最近工作需要把壓縮文件解壓,經過測試有兩種方法,一種是JDK自帶的ZipFile,

      另外一種是org.apache.tools.zip進行解壓。

2、經測試,JDK自帶的文件不能處理文件名爲中文的壓縮文件(包括壓縮文件包含的文件名)

     原因是:壓縮解壓ZIP文件對文件名都是以UTF-8編碼方式來處理的,而WinZip對文件名只會

    以ASCII編碼方式來處理

3、解決辦法:Apache Ant有個包專門處理ZIP文件,可以指定文件名的編碼方式。由此可以解決問題。

4、代碼如下:

   說明:zipFileName是文件的絕對路徑(包含文件名稱),outputDirectory是輸出路徑(不包含名稱)

比如:zipFileName=D:\\pdf\\zip\\test測試.zip

outputDirectory=D:\\pdf\\zip 

        如需共同討論請聯繫QQ:470312712     

public static void unZip(String zipFileName, String outputDirectory)throws Exception {
try {
ZipFile zipFile = new ZipFile(zipFileName, "GB2312");
Enumeration e = zipFile.getEntries();
ZipEntry zipEntry = null;
createDirectory(outputDirectory, "");
while (e.hasMoreElements()) {
zipEntry = (ZipEntry) e.nextElement();
System.out.println("unziping " + zipEntry.getName());
if (zipEntry.isDirectory()) {
String name = zipEntry.getName();
name = name.substring(0, name.length() - 1);
File f = new File(outputDirectory + File.separator + name);
f.mkdir();
System.out.println("創建目錄:" + outputDirectory+ File.separator + name);
} else {
String fileName = zipEntry.getName();
fileName = fileName.replace('\\', '/');
if (fileName.indexOf("/") != -1) {
createDirectory(outputDirectory, fileName.substring(0,fileName.lastIndexOf("/")));
fileName = fileName.substring(fileName.lastIndexOf("/") + 1, fileName.length());
}

File f = new File(outputDirectory + File.separator+ zipEntry.getName());
f.createNewFile();
InputStream in = zipFile.getInputStream(zipEntry);
FileOutputStream out = new FileOutputStream(f);
byte[] by = new byte[1024];
int c;
while ((c = in.read(by)) != -1) {
out.write(by, 0, c);
}
out.close();
in.close();
}
}
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章