標籤: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檔案中含有中文子檔案操作