例如:用org.apache.tools.zip.ZipOutputStream代替java.util.zip.ZipOutputStream。
java對於文字的編碼是以 unicode為基礎,因此,若是以ZipInputStream及ZipOutputStream來處理壓縮及解壓縮的工作,碰到中文檔名或路徑,那當然是以unicode來處理。但是,現在市面上的壓縮及解壓縮軟體,例如winzip,卻是不支援unicode的,一碰到檔名以unicode編碼的檔案,它就不處理。 那要如何才能做出讓WinRar能夠處理的壓縮檔呢?那就得從修改ZipInputStream及ZipOutputStream對於檔名的編碼方式來着手了。我們可以從jdk的src.zip取得ZipInputStream及ZipOutputStream的原始碼來加以修改。
一、ZipOutputStream.java
1.從jdk的src.zip取得ZipOutputStream.java原始碼,另存到一個新文件中,檔名改為CnZipOutputStream.java。
2.開始修改原始碼,將class名稱改為CnZipOutputStream
3.建構式也必須更改為CnZipOutputStream
4.新增member,這個member記錄編碼方式
private String encoding="UTF-8";
5.再新增一個建構式(這個建構式可以讓這個class在new的時候,設定檔名的編碼)
public CZipOutputStream(OutputStream out,String encoding) {
this(out);
this.encoding=encoding;
}
6.找到byte[] nameBytes = getUTF8Bytes(e.name);(有二個地方),將它修改如下:
byte[] nameBytes = null;
try
{
if (this.encoding.toUpperCase().equals("UTF-8"))
nameBytes =getUTF8Bytes(e.name);
else
nameBytes= e.name.getBytes(this.encoding);
}
catch(Exception byteE)
{
nameBytes=getUTF8Bytes(e.name);
}
二、ZipInputStream.java
1.從jdk的src.zip取得ZipInputStream.java原始碼,另存到一個新文件中,檔名改為CnZipInputStream.java。
2.開始修改原始碼,將class名稱改為CnZipInputStream
3.建構式也必須更改為CnZipInputStream
4.新增member,這個member記錄編碼方式
private String encoding="UTF-8";
5.再新增一個建構式如下(這個建構式可以讓這個class在new的時候,設定檔名的編碼)
public CZipInputStream(InputStream in,String encoding) {
this(in);
this.encoding=encoding;
}
6.找到ZipEntry e = createZipEntry(getUTF8String(b, 0, len));這一行,將它改成如下:
ZipEntry e=null;
try
{
if (this.encoding.toUpperCase().equals("UTF-8"))
e=createZipEntry(getUTF8String(b, 0, len));
else
e=createZipEntry(new String(b,0,len,this.encoding));
}
catch(Exception byteE)
{
e=createZipEntry(getUTF8String(b, 0, len));
}
以上兩個檔案儲存後compile產生CZipOutputStream.class及CZipInputStream.class,使用winzip開啟 [java_home]\jre\lib\rt.jar這個檔案,將CnZipOutputStream.class及 CnZipInputStream.class加進去,以後當壓縮及解壓縮時有中文檔名及路徑的問題時,就可以指定編碼方式來處理了。
使用方法:
CnZipOutputStream zos=new CnZipOutputStream(OutputStream os,String encoding);
CnZipInputStream zins=new CnZipInputStream(InputStream ins,String encoding);
對於前面文章中文件打包下載中遇到的中文文件問題,解決手法是:
OutputStream os = response.getOutputStream();
CnZipOutputStream zos = new CnZipOutputStream(os,"gbk"); //加上中文編碼類型