熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

修改ZipInputStream支持中文名文件解壓

2013-11-15 11:46:20  來源: JSP教程 

  之前介紹了利用javautilzip這個package裡的class來完成壓縮及解壓縮的工作但是我們知道java對於文字的編碼是以unicode為基礎因此若是以ZipInputStream及ZipOutputStream來處理壓縮及解壓縮的工作碰到中文檔名或路徑那當然是以unicode來處理羅!
  
  但是現在市面上的壓縮及解壓縮軟體例如winzip卻是不支援unicode的一碰到檔名以unicode編碼的檔案它就不處理
  
  那要如何才能做出讓winzip能夠處理的壓縮檔呢?那就得從修改ZipInputStream及ZipOutputStream對於檔名的編碼方式來著手了我們可以從jdk的srczip取得ZipInputStream及ZipOutputStream的原始碼來加以修改
  
  ZipOutputStreamjava
  從jdk的srczip取得ZipOutputStreamjava原始碼另存新檔存到c:\java\util\zip這個資料夾裡檔名改為CZipOutputStreamjava
  開始修改原始碼將class名稱改為CZipOutputStream
  建構式也必須更改為CZipOutputStream
  新增member這個member記錄編碼方式
   private String encoding=UTF;
  再新增一個建構式(這個建構式可以讓這個class在new的時候設定檔名的編碼)
   public CZipOutputStream(OutputStream outString encoding) {
     super(out new Deflater(DeflaterDEFAULT_COMPRESSION true));
     usesDefaultDeflater = true;
     thisencoding=encoding;
   }
  找到byte[] nameBytes = getUTFBytes(ename);(有二個地方)將它修改如下
   byte[] nameBytes = null;
   try
   {
    if (thisencodingtoUpperCase()equals(UTF))
      nameBytes =getUTFBytes(ename);
    else
      nameBytes= enamegetBytes(thisencoding);
   }
   catch(Exception byteE)
   {
    nameBytes=getUTFBytes(ename);
   }
  將檔案儲存在c:\java\util\zip這個資料夾內請記得一定要有這個路徑結構才能把CZipOutputStreamclass放在正確的package結構裡
  
  ZipInputStreamjava
  從jdk的srczip取得ZipInputStreamjava原始碼另存新檔存到c:\java\util\zip這個資料夾裡檔名改為CZipInputStreamjava
  開始修改原始碼將class名稱改為CZipInputStream
  建構式也必須更改為CZipInputStream
  新增member這個member記錄編碼方式
   private String encoding=UTF;
  再新增一個建構式如下(這個建構式可以讓這個class在new的時候設定檔名的編碼)
  public CZipInputStream(InputStream inString encoding) {
   super(new PushbackInputStream(in)new Inflater(true));
   usesDefaultInflater = true;
   if(in == null) {
      throw new NullPointerException(in is null);
   }
   thisencoding=encoding;
  }
  
  找到ZipEntry e = createZipEntry(getUTFString(b len));這一行將它改成如下
  ZipEntry e=null;
  try
  {
   if (thisencodingtoUpperCase()equals(UTF))
     e=createZipEntry(getUTFString(b len));
   else
     e=createZipEntry(new String(blenthisencoding));
  }
  catch(Exception byteE)
  {
   e=createZipEntry(getUTFString(b len));
  }
  將檔案儲存在c:\java\util\zip這個資料夾內請記得一定要有這個路徑結構才能把CZipInputStreamclass放在正確的package結構裡
  
  以上兩個檔案儲存後compile產生CZipOutputStreamclass及CZipInputStreamclass使用winzip開啟[java_home]\jre\lib\rtjar這個檔案將CZipOutputStreamclass及CZipInputStreamclass加進去記得「Save full path info」一定要打勾以後當壓縮及解壓縮時有中文檔名及路徑的問題時就可以指定編碼方式來處理了
  
  CZipOutputStream zos=new CZipOutputStream(OutputStream osString encoding);
  CZipInputStream zins=new CZipInputStream(InputStream insString encoding);
  以「壓縮與解壓縮()」為例
  FileOutputStream fos =new FileOutputStream(requestgetRealPath(/)+myzipzip);
  CZipOutputStream zos=new CZipOutputStream(fosBIG);
  其他地方都不用改便可以處理中文檔名的壓縮
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19592.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.