国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

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

2019-11-18 13:15:39
字體:
供稿:網(wǎng)友

  之前介紹了利用java.util.zip這個(gè)package里的class來完成壓縮及解壓縮的工作,但是我們知道,java對於文字的編碼是以unicode為基礎(chǔ),因此,若是以ZipInputStream及ZipOutputStream來處理壓縮及解壓縮的工作,碰到中文檔名或路徑,那當(dāng)然是以unicode來處理羅!
  
  但是,現(xiàn)在市面上的壓縮及解壓縮軟體,例如WinZip,卻是不支援unicode的,一碰到檔名以unicode編碼的檔案,它就不處理。
  
  那要如何才能做出讓winzip能夠處理的壓縮檔呢?那就得從修改ZipInputStream及ZipOutputStream對於檔名的編碼方式來著手了。我們可以從jdk的src.zip取得ZipInputStream及ZipOutputStream的原始碼來加以修改:
  
  一、ZipOutputStream.java
  1.從jdk的src.zip取得ZipOutputStream.java原始碼,另存新檔存到c:/java/util/zip這個(gè)資料夾里,檔名改為CZipOutputStream.java。
  2.開始修改原始碼,將class名稱改為CZipOutputStream
  3.建構(gòu)式也必須更改為CZipOutputStream
  4.新增member,這個(gè)member記錄編碼方式
   PRivate String encoding="UTF-8";
  5.再新增一個(gè)建構(gòu)式(這個(gè)建構(gòu)式可以讓這個(gè)class在new的時(shí)候,設(shè)定檔名的編碼)
   public CZipOutputStream(OutputStream out,String encoding) {
     super(out, new Deflater(Deflater.DEFAULT_COMPRESSION, true));
     usesDefaultDeflater = true;
     this.encoding=encoding;
   }
  6.找到byte[] nameBytes = getUTF8Bytes(e.name);(有二個(gè)地方),將它修改如下:
   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);
   }
  7.將檔案儲存在c:/java/util/zip這個(gè)資料夾內(nèi),請記得一定要有這個(gè)路徑結(jié)構(gòu),才能把CZipOutputStream.class放在正確的package結(jié)構(gòu)里
  
  二、ZipInputStream.java
  1.從jdk的src.zip取得ZipInputStream.java原始碼,另存新檔存到c:/java/util/zip這個(gè)資料夾里,檔名改為CZipInputStream.java。
  2.開始修改原始碼,將class名稱改為CZipInputStream
  3.建構(gòu)式也必須更改為CZipInputStream
  4.新增member,這個(gè)member記錄編碼方式
   private String encoding="UTF-8";
  5.再新增一個(gè)建構(gòu)式如下(這個(gè)建構(gòu)式可以讓這個(gè)class在new的時(shí)候,設(shè)定檔名的編碼)
  public CZipInputStream(InputStream in,String encoding) {
   super(new PushbackInputStream(in,512),new Inflater(true),512);
   usesDefaultInflater = true;
   if(in == null) {
      throw new NullPointerException("in is null");
   }
   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));
  }
  7.將檔案儲存在c:/java/util/zip這個(gè)資料夾內(nèi),請記得一定要有這個(gè)路徑結(jié)構(gòu),才能把CZipInputStream.class放在正確的package結(jié)構(gòu)里
  
  以上兩個(gè)檔案儲存後compile產(chǎn)生CZipOutputStream.class及CZipInputStream.class,使用winzip開啟[java_home]/jre/lib/rt.jar這個(gè)檔案,將CZipOutputStream.class及CZipInputStream.class加進(jìn)去,記得「Save full path info」一定要打勾。以後當(dāng)壓縮及解壓縮時(shí)有中文檔名及路徑的問題時(shí),就可以指定編碼方式來處理了。
  
  CZipOutputStream zos=new CZipOutputStream(OutputStream os,String encoding);
  CZipInputStream zins=new CZipInputStream(InputStream ins,String encoding);
  以「壓縮與解壓縮(1)」為例:
  FileOutputStream fos =new FileOutputStream(request.getRealPath("/")+"myzip.zip");
  CZipOutputStream zos=new CZipOutputStream(fos,"BIG5");
  其他地方都不用改,便可以處理中文檔名的壓縮。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 遂平县| 金乡县| 天峻县| 陕西省| 临澧县| 宿州市| 巴彦县| 贵德县| 定南县| 克东县| 苍南县| 全椒县| 西昌市| 奎屯市| 博客| 安龙县| 孟州市| 平舆县| 涡阳县| 行唐县| 中阳县| 英德市| 卢龙县| 黄山市| 平度市| 建水县| 长治县| 嫩江县| 赤壁市| 铜梁县| 田阳县| 万宁市| 屏东市| 任丘市| 万全县| 商河县| 崇仁县| 老河口市| 肃南| 河间市| 麻城市|