麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

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

2019-11-18 13:15:39
字體:
來源:轉載
供稿:網友

  之前介紹了利用java.util.zip這個package里的class來完成壓縮及解壓縮的工作,但是我們知道,java對於文字的編碼是以unicode為基礎,因此,若是以ZipInputStream及ZipOutputStream來處理壓縮及解壓縮的工作,碰到中文檔名或路徑,那當然是以unicode來處理羅!
  
  但是,現在市面上的壓縮及解壓縮軟體,例如WinZip,卻是不支援unicode的,一碰到檔名以unicode編碼的檔案,它就不處理。
  
  那要如何才能做出讓winzip能夠處理的壓縮檔呢?那就得從修改ZipInputStream及ZipOutputStream對於檔名的編碼方式來著手了。我們可以從jdk的src.zip取得ZipInputStream及ZipOutputStream的原始碼來加以修改:
  
  一、ZipOutputStream.java
  1.從jdk的src.zip取得ZipOutputStream.java原始碼,另存新檔存到c:/java/util/zip這個資料夾里,檔名改為CZipOutputStream.java。
  2.開始修改原始碼,將class名稱改為CZipOutputStream
  3.建構式也必須更改為CZipOutputStream
  4.新增member,這個member記錄編碼方式
   PRivate String encoding="UTF-8";
  5.再新增一個建構式(這個建構式可以讓這個class在new的時候,設定檔名的編碼)
   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);(有二個地方),將它修改如下:
   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這個資料夾內,請記得一定要有這個路徑結構,才能把CZipOutputStream.class放在正確的package結構里
  
  二、ZipInputStream.java
  1.從jdk的src.zip取得ZipInputStream.java原始碼,另存新檔存到c:/java/util/zip這個資料夾里,檔名改為CZipInputStream.java。
  2.開始修改原始碼,將class名稱改為CZipInputStream
  3.建構式也必須更改為CZipInputStream
  4.新增member,這個member記錄編碼方式
   private String encoding="UTF-8";
  5.再新增一個建構式如下(這個建構式可以讓這個class在new的時候,設定檔名的編碼)
  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這個資料夾內,請記得一定要有這個路徑結構,才能把CZipInputStream.class放在正確的package結構里
  
  以上兩個檔案儲存後compile產生CZipOutputStream.class及CZipInputStream.class,使用winzip開啟[java_home]/jre/lib/rt.jar這個檔案,將CZipOutputStream.class及CZipInputStream.class加進去,記得「Save full path info」一定要打勾。以後當壓縮及解壓縮時有中文檔名及路徑的問題時,就可以指定編碼方式來處理了。
  
  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");
  其他地方都不用改,便可以處理中文檔名的壓縮。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 亚洲va久久久噜噜噜久牛牛影视 | 羞羞视频免费视频欧美 | 国产成年人网站 | 羞羞视频免费视频欧美 | 精国产品一区二区三区四季综 | 草草久 | 色播视频网站 | 久久国产精品电影 | 一本色道精品久久一区二区三区 | 日本在线观看高清完整版 | 国产午夜精品久久久久久久蜜臀 | 一区二区美女视频 | 国产精品免费视频观看 | 成人性生活视频在线观看 | 日产精品久久久一区二区福利 | sm高h视频 | 久久久一区二区精品 | 91精品国产日韩91久久久久久360 | 国产精品午夜未成人免费观看 | 中文字幕在线观看www | 久草在线精品观看 | 色诱亚洲精品久久久久久 | 亚洲国产一区二区三区 | 欧美一区二区三区中文字幕 | 九九视频在线观看黄 | 91成人免费电影 | 国产成人在线观看网站 | 国产精品久久久乱弄 | 免费午夜视频在线观看 | 久久99在线 | 免费久久久久久 | 欧美性受xxxx白人性爽 | 国产精品99久久久久久久 | 亚洲成人在线视频网站 | 亚洲日本韩国在线观看 | 日本a大片| 午夜精品久久久久久久99热浪潮 | av不卡毛片| 国产91一区 | 91在线色视频 | 欧美性成人 |