Java 對zip檔案中含有中文子檔案操作

來源:互聯網
上載者:User

標籤:java   zip   


小魚仔做檔案壓縮解壓的時候,開始並沒有注意細節,使用的java jdk中zip操作工具類

這樣導致的問題是對中文操作都是亂碼,要麼就是破損。

查閱資料才知道這個實在1.6的曆史遺留問題

還好開源的apache 提供了一個支援包,讓我們拿過來就可以用。

下面是下載連結


提供jar包下載連結:http://download.csdn.net/detail/u010962482/8748091


廢話不多說 貼上解壓壓縮代碼。

 /**     * 解壓檔案到指定目錄     * @param zipFile     * @param descDir     * @author isea533     */      @SuppressWarnings( "rawtypes")     public static void unZipFiles(String zip_s_File,String descDir){     OutputStream out= null;     InputStream in = null;     File zipFile= new File(zip_s_File);             //判斷解壓路徑是否存在,不存在則建立     File pathFile = new File(descDir);         if(!pathFile.exists()){             pathFile.mkdirs();         }        //建立待解壓檔案夾路徑        ZipFile zip;           try {
<span style="white-space:pre"></span>//注意 這裡的編碼 按自己情況自己填寫              zip = new ZipFile(zipFile,"gbk" );               for(Enumeration   entries = zip.getEntries();entries.hasMoreElements();){                  ZipEntry entry = (ZipEntry)entries.nextElement();                  String zipEntryName = entry.getName();                  in = zip.getInputStream(entry);                  String outPath = (descDir+zipEntryName).replaceAll("\\*" , "/" );;                  //輸出檔案路徑資訊  ,如果存在檔案則覆蓋,如果不想覆蓋修改OUTputStream的Boolean類型                 System. out.println(outPath);                   out = new FileOutputStream(outPath,true );                  byte[] buf1 = new byte[1024];                  int len;                  while((len=in.read(buf1))>0){                      out.write(buf1,0,len);                  }                                  }               System. out.println("******************解壓完畢********************" );                 } catch (IOException e) {              System. out.println("解壓檔案失敗" );              e.printStackTrace();          } finally{               try {                   in.close();                  out.close();               } catch (Exception e2) {                   System. out.println("管理io流失敗" );                   e2.printStackTrace();              }          }           }           /**    *    * @param sourceFilePath   需要壓縮 zip 路徑    * @param zipFilePath      zip壓縮檔路徑    * @param fileName         zip 名字    * @return    */   public static boolean fileToZip(String sourceFilePath,String zipFilePath,String fileName){      boolean flag = false ;      File sourceFile = new File(sourceFilePath);      FileInputStream fis = null;      BufferedInputStream bis = null;      FileOutputStream fos = null;      ZipOutputStream zos = null;           if(sourceFile.exists() == false){          System. out.println("待壓縮的檔案目錄:" +sourceFilePath+"不存在." );      } else{              File zipFile = new File(zipFilePath + "/" + fileName +".zip" );                 try {       if(zipFile.exists()){                  System. out.println(zipFilePath + "目錄下存在名字為:" + fileName +".zip" + "打包檔案." );              } else{                  File[] sourceFiles = sourceFile.listFiles();                  if(null == sourceFiles || sourceFiles.length<1){                      System. out.println("待壓縮的檔案目錄:" + sourceFilePath + "裡面不存在檔案,無需壓縮." );                  } else{                      fos = new FileOutputStream(zipFile);                      zos = new ZipOutputStream(new BufferedOutputStream(fos));                      zos.setEncoding( "gbk");                      byte[] bufs = new byte[1024*10];                      for(int i=0;i<sourceFiles.length ;i++){                          //建立ZIP實體,並添加進壓縮包                          ZipEntry zipEntry = new ZipEntry(sourceFiles[i].getName());                                                   zos.putNextEntry(zipEntry);                          //讀取待壓縮的檔案並寫進壓縮包裡                          fis = new FileInputStream(sourceFiles[i]);                          bis = new BufferedInputStream(fis, 1024*10);                          int read = 0;                          while((read=bis.read(bufs, 0, 1024*10)) != -1){                              zos.write(bufs,0,read);                          }                      }                      flag = true;                  }              }          } catch (FileNotFoundException e) {              e.printStackTrace();              throw new RuntimeException(e);          } catch (IOException e) {              e.printStackTrace();              throw new RuntimeException(e);          } finally{              //關閉流              try {                  if(null != bis) bis.close();                  if(null != zos) zos.close();              } catch (IOException e) {                  e.printStackTrace();                  throw new RuntimeException(e);              }          }      }      return flag;  }






Java 對zip檔案中含有中文子檔案操作

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.