/**
?* 利用zip庫壓縮/解壓文件夾
?* 因為java的基本zip庫是不支持中文文件名的。所以壓縮后中文名的條目都變成了亂碼,利用rar解壓工具解壓不了名字為亂碼的壓縮文件,但自己寫的解壓方法在windows下解壓后編碼正常顯示中文,而其他系統下則不能正常還原;
?
?
* 可以用ant.jar包下的zip類來壓縮文件夾,apache tools下的zip庫是支持中文的。(ant.jar包下面可以下載)
? 第一種是沒處理中文亂碼的···
?
* @author 小苗
?*/
? 第一種:
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; /** * 壓縮一個目錄,包括目錄下的所有文件 * java的基本zip庫是不支持中文文件名的。 * 可以用ant.jar包下的zip類,apache tools下的zip庫是支持中文的。 * @author 小苗 */ public class CompressDir { /** * 壓縮文件夾方法(此方法壓縮后有根目錄且名字與被壓縮文件夾名一樣,效果如圖1) * @param inputFile 被壓縮的文件夾 * @param str 壓縮條目根目錄名 * @param zipFile 壓縮后的輸出流 * @throws IOException */ public void comDir2(File inputFile,String str,ZipOutputStream zipFile) throws IOException{ //判斷文件是否為文件夾 if(inputFile.isDirectory()){ File[] files = inputFile.listFiles(); zipFile.putNextEntry(new ZipEntry(str+"/")); //使用指定名字創建壓縮條目 str = str.length()==0 ? "":str+"/"; for (int i=0;i<files.length;i++) { comDir2(files[i],str+files[i].getName(), zipFile); //遞歸調用壓縮方法 } }else{ InputStream in = new FileInputStream(inputFile); //開始寫入新的 ZIP 文件條目并將流定位到條目數據的開始處。 ZipEntry zipname = new ZipEntry(str); zipFile.putNextEntry(zipname); byte[] buff = new byte[1024]; int len = 0; while((len = in.read(buff))!=-1){ zipFile.write(buff, 0, len); } in.close(); } } /** * @param s3 被壓縮的文件夾 * @param s4 壓縮后輸出路徑 * @throws IOException */ public void comDir(File s3,File s4) throws IOException { System.out.println("正在壓縮文件···"); //定義 Zip格式的輸出流 ZipOutputStream zip_out = new ZipOutputStream(new FileOutputStream(s4)); comDir2(s3,s3.getName(),zip_out); //調用壓縮方法 zip_out.close(); //關閉流 } /** * 解壓縮zip文件的方法 * @param zipFileName 要被解壓的文件 * @param outputDirectory 解壓輸出路徑 */ public void unzip(String zipFileName, String outputDirectory) { System.out.println("正在解壓···"); try { ZipInputStream in = new ZipInputStream(new FileInputStream(zipFileName)); /*獲取ZipInputStream中的ZipEntry條目,一個zip文件中可能包含多個ZipEntry, *當getNextEntry方法的返回值為null,則代表ZipInputStream中沒有下一個ZipEntry, *輸入流讀取完成; */ ZipEntry z = in.getNextEntry(); while (z != null) { System.out.println("unziping " + z.getName()); //創建以zip包文件名為目錄名的根目錄 File f = new File(outputDirectory); f.mkdirs(); if (z.isDirectory()) { String name = z.getName(); name = name.substring(0, name.length() - 1); f = new File(outputDirectory + File.separator + name); f.mkdirs(); } else { f = new File(outputDirectory + File.separator + z.getName()); f.createNewFile(); FileOutputStream out = new FileOutputStream(f); byte[] buff = new byte[1024]; int len ; while ((len = in.read(buff)) != -1) { out.write(buff,0,len); } out.close(); } z = in.getNextEntry(); //讀取下一個ZipEntry } in.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) throws IOException { CompressDir com = new CompressDir(); //壓縮 com.comDir(new File("d:\\Temp"), new File("d:\\temp.zip")); System.out.println("壓縮完成!"); //解壓 如果此處不指定解壓的具體目錄,如:test2,那么則直接解壓到根目錄下 com.unzip("d:\\temp.zip", "d:\\"); System.out.println("解壓完成!"); } }
??
第二種:
問題:①怎么解決中文名文件壓縮后為亂碼
?* java的基本zip庫是不支持中文文件名的。參考了網上的一些解決方法
?* 發現Ant的apache tools下的zip庫是支持中文的。
?* 下面就是采用該方式實現的在中文文件名下的文件壓縮代碼:
?? 在給出實現代碼之前,有一點需要指出,那就是必須要在工程中引Ant.jar的包,此包下面可以下載。
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipOutputStream ; /** * @author 小苗 */ //此方法壓縮后 沒有根目錄,效果如圖2 public class CompressDir02 { public static File inpath = new File("d:\\Temp"); public static ZipOutputStream zout = null; //輸出流確定 static { try { zout = new ZipOutputStream(new FileOutputStream("d:\\temp.zip")); // zout.setEncoding("GBK"); } catch (FileNotFoundException e) { e.printStackTrace(); } } public void dozip(File file) { File[] files = file.listFiles(); for (File f : files) { if (f.isFile()) { docopy(f); } else dozip(f); } } public void docopy(File f) { try { InputStream in = new FileInputStream(f); //創建壓縮條目 String tempPath = f.getAbsolutePath().replace( inpath.getAbsolutePath() + "\\", ""); ZipEntry zent = new ZipEntry(tempPath); System.out.println("壓縮條目:"+tempPath); zout.putNextEntry(zent); byte[] buff = new byte[1024]; int len = 0; while ((len = in.read(buff)) != -1) { zout.write(buff, 0, len); } in.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) throws IOException { CompressDir02 com = new CompressDir02(); File ff = new File("d:\\Temp"); System.out.println("開始壓縮文件···"); com.dozip(ff); System.out.println("壓縮完成!"); com.zout.close(); } }
??
?
?
圖1:
?
?
?????? ??????????????????????????????????????????????????????????????? 圖2:
?
?
?
?
?
?
?
?
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
