程序實現了ZIP壓縮。共分為2部分 : 壓縮(compression)與解壓(decompression)
大致功能包括用了多態,遞歸等JAVA核心技術,可以對單個文件和任意級聯文件夾進行壓縮和解壓。 需在代碼中自定義源輸入路徑和目標輸出路徑。
1. package com.han; 2. 3. import java.io.*; 4. import java.util.zip.*; 5. 6. /** 7. * 程序實現了ZIP壓縮。共分為2部分 : 壓縮(compression)與解壓(decompression) 8. * <p> 9. * 大致功能包括用了多態,遞歸等JAVA核心技術,可以對單個文件和任意級聯文件夾進行壓縮和解壓。 需在代碼中自定義源輸入路徑和目標輸出路徑。 10. * <p> 11. * 在本段代碼中,實現的是壓縮部分;解壓部分見本包中Decompression部分。 12. * 13. * @author HAN 14. * 15. */ 16. 17. public class MyZipCompressing { 18. private int k = 1; // 定義遞歸次數變量 19. 20. public MyZipCompressing() { 21. // TODO Auto-generated constructor stub 22. } 23. 24. /** 25. * @param args 26. */ 27. public static void main(String[] args) { 28. // TODO Auto-generated method stub 29. MyZipCompressing book = new MyZipCompressing(); 30. try { 31. book.zip("C:\\Users\\Gaowen\\Desktop\\ZipTestCompressing.zip", 32. new File("C:\\Users\\Gaowen\\Documents\\Tencent Files")); 33. } catch (Exception e) { 34. // TODO Auto-generated catch block 35. e.printStackTrace(); 36. } 37. 38. } 39. 40. private void zip(String zipFileName, File inputFile) throws Exception { 41. System.out.println("壓縮中..."); 42. ZipOutputStream out = new ZipOutputStream(new FileOutputStream( 43. zipFileName)); 44. BufferedOutputStream bo = new BufferedOutputStream(out); 45. zip(out, inputFile, inputFile.getName(), bo); 46. bo.close(); 47. out.close(); // 輸出流關閉 48. System.out.println("壓縮完成"); 49. } 50. 51. private void zip(ZipOutputStream out, File f, String base, 52. BufferedOutputStream bo) throws Exception { // 方法重載 53. if (f.isDirectory()) { 54. File[] fl = f.listFiles(); 55. if (fl.length == 0) { 56. out.putNextEntry(new ZipEntry(base + "/")); // 創建zip壓縮進入點base 57. System.out.println(base + "/"); 58. } 59. for (int i = 0; i < fl.length; i++) { 60. zip(out, fl[i], base + "/" + fl[i].getName(), bo); // 遞歸遍歷子文件夾 61. } 62. System.out.println("第" + k + "次遞歸"); 63. k++; 64. } else { 65. out.putNextEntry(new ZipEntry(base)); // 創建zip壓縮進入點base 66. System.out.println(base); 67. FileInputStream in = new FileInputStream(f); 68. BufferedInputStream bi = new BufferedInputStream(in); 69. int b; 70. while ((b = bi.read()) != -1) { 71. bo.write(b); // 將字節流寫入當前zip目錄 72. } 73. bi.close(); 74. in.close(); // 輸入流關閉 75. } 76. } 77. }
1. package com.han; 2. 3. import java.io.*; 4. import java.util.zip.*; 5. /** 6. * 程序實現了ZIP壓縮。共分為2部分 : 7. * 壓縮(compression)與解壓(decompression) 8. * <p> 9. * 大致功能包括用了多態,遞歸等JAVA核心技術,可以對單個文件和任意級聯文件夾進行壓縮和解壓。 10. * 需在代碼中自定義源輸入路徑和目標輸出路徑。 11. * <p> 12. * 在本段代碼中,實現的是解壓部分;壓縮部分見本包中compression部分。 13. * @author HAN 14. * 15. */ 16. public class CopyOfMyzipDecompressing { 17. 18. public static void main(String[] args) { 19. // TODO Auto-generated method stub 20. long startTime=System.currentTimeMillis(); 21. try { 22. ZipInputStream Zin=new ZipInputStream(new FileInputStream( 23. "C:\\Users\\HAN\\Desktop\\stock\\SpectreCompressed.zip"));//輸入源zip路徑 24. BufferedInputStream Bin=new BufferedInputStream(Zin); 25. String Parent="C:\\Users\\HAN\\Desktop"; //輸出路徑(文件夾目錄) 26. File Fout=null; 27. ZipEntry entry; 28. try { 29. while((entry = Zin.getNextEntry())!=null && !entry.isDirectory()){ 30. Fout=new File(Parent,entry.getName()); 31. if(!Fout.exists()){ 32. (new File(Fout.getParent())).mkdirs(); 33. } 34. FileOutputStream out=new FileOutputStream(Fout); 35. BufferedOutputStream Bout=new BufferedOutputStream(out); 36. int b; 37. while((b=Bin.read())!=-1){ 38. Bout.write(b); 39. } 40. Bout.close(); 41. out.close(); 42. System.out.println(Fout+"解壓成功"); 43. } 44. Bin.close(); 45. Zin.close(); 46. } catch (IOException e) { 47. // TODO Auto-generated catch block 48. e.printStackTrace(); 49. } 50. } catch (FileNotFoundException e) { 51. // TODO Auto-generated catch block 52. e.printStackTrace(); 53. } 54. long endTime=System.currentTimeMillis(); 55. System.out.println("耗費時間: "+(endTime-startTime)+" ms"); 56. } 57. 58. }