資源描述:
《Java中壓縮與解壓》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在教育資源-天天文庫。
1、Java中壓縮與解壓--中文文件名亂碼解決辦法收藏本文參閱了臺灣JSP學習網(wǎng)部分內(nèi)容,略有增刪.java對於文字的編碼是以unicode為基礎,因此,若是以ZipInputStream及ZipOutputStream來處理壓縮及解壓縮的工作,碰到中文檔名或路徑,那當然是以unicode來處理羅!但是,現(xiàn)在市面上的壓縮及解壓縮軟體,例如winzip,卻是不支援unicode的,一碰到檔名以unicode編碼的檔案,它就不處理。那要如何才能做出讓WinRar能夠處理的壓縮檔呢?那就得從修改ZipInputStream及ZipO
2、utputStream對於檔名的編碼方式來著手了。我們可以從jdk的src.zip取得ZipInputStream及ZipOutputStream的原始碼來加以修改一、ZipOutputStream.java1.從jdk的src.zip取得ZipOutputStream.java原始碼,另存到一個新文件中,檔名改為CnZipOutputStream.java。2.開始修改原始碼,將class名稱改為CnZipOutputStream3.建構式也必須更改為CnZipOutputStream4.新增member,這個membe
3、r記錄編碼方式?privateStringencoding="UTF-8";5.再新增一個建構式(這個建構式可以讓這個class在new的時候,設定檔名的編碼)?publicCZipOutputStream(OutputStreamout,Stringencoding){????this(out);????this.encoding=encoding;?}6.找到byte[]nameBytes=getUTF8Bytes(e.name);(有二個地方),將它修改如下:1.byte[]nameBytes=null;2.?try
4、3.?{4.?if(this.encoding.toUpperCase().equals("UTF-8"))5.?nameBytes=getUTF8Bytes(e.name);1.?else2.?nameBytes=e.name.getBytes(this.encoding);3.?}4.?catch(ExceptionbyteE)5.?{6.?nameBytes=getUTF8Bytes(e.name);7.?}二、ZipInputStream.java1.從jdk的src.zip取得ZipInputStream.jav
5、a原始碼,另存到一個新文件中,檔名改為CnZipInputStream.java。2.開始修改原始碼,將class名稱改為CnZipInputStream3.建構式也必須更改為CnZipInputStream4.新增member,這個member記錄編碼方式?privateStringencoding="UTF-8";5.再新增一個建構式如下(這個建構式可以讓這個class在new的時候,設定檔名的編碼)publicCZipInputStream(InputStreamin,Stringencoding){?this(in
6、);?this.encoding=encoding;}6.找到ZipEntrye=createZipEntry(getUTF8String(b,0,len));這一行,將它改成如下:1.ZipEntrye=null;2.?try3.?{4.?if(this.encoding.toUpperCase().equals("UTF-8"))5.?e=createZipEntry(getUTF8String(b,0,len));6.?else1.?e=createZipEntry(newString(b,0,len,this.en
7、coding));2.?}3.?catch(ExceptionbyteE)4.?{5.?e=createZipEntry(getUTF8String(b,0,len));6.?}以上兩個檔案儲存後compile產(chǎn)生CZipOutputStream.class及CZipInputStream.class,使用winzip開啟[java_home]jrelibrt.jar這個檔案,將CnZipOutputStream.class及CnZipInputStream.class加進去,以後當壓縮及解壓縮時有中文檔名及路徑的問
8、題時,就可以指定編碼方式來處理了。使用方法:CnZipOutputStreamzos=newCnZipOutputStream(OutputStreamos,Stringencoding);CnZipInputStreamzins=newCnZipInputStream(InputStreamins,S