簡單測試Demo:如何用Java壓縮文件夾和文件
阿新 • • 發佈:2018-09-20
stat des false class ram ror 如何 cef author
一、直接貼出測試代碼
1 package com.jason.zip; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 import java.io.OutputStream; 8 import java.util.ArrayList; 9 import java.util.List; 10 import java.util.zip.ZipEntry;11 import java.util.zip.ZipOutputStream; 12 /** 13 * 壓縮文件夾或批量壓縮文件 14 * @function 15 * @author 小風微涼 16 * @time 2018-9-14 下午2:12:45 17 */ 18 public class ZipAction { 19 private static final int BUFFER_SIZE = 2 * 1024; 20 /** 21 * 壓縮成ZIP 22 * @param srcDir 壓縮文件夾路徑 23* @param out 壓縮文件輸出流 24 * @param KeepDirStructure 是否保留原來的目錄結構,true:保留目錄結構; 25 * false:所有文件跑到壓縮包根目錄下(註意:不保留目錄結構可能會出現同名文件,會壓縮失敗) 26 * @throws RuntimeException 壓縮失敗會拋出運行時異常 27 */ 28 public static void toZip(String srcDir, OutputStream out, booleanKeepDirStructure) 29 throws RuntimeException{ 30 long start = System.currentTimeMillis(); 31 ZipOutputStream zos = null ; 32 try { 33 zos = new ZipOutputStream(out); 34 File sourceFile = new File(srcDir); 35 compress(sourceFile,zos,sourceFile.getName(),KeepDirStructure); 36 long end = System.currentTimeMillis(); 37 System.out.println("壓縮完成,耗時:" + (end - start) +" ms"); 38 } catch (Exception e) { 39 throw new RuntimeException("zip error from ZipAction",e); 40 }finally{ 41 if(zos != null){ 42 try { 43 zos.close(); 44 } catch (IOException e) { 45 e.printStackTrace(); 46 } 47 } 48 } 49 } 50 51 /** 52 * 壓縮成ZIP 方法2 53 * @param srcFiles 需要壓縮的文件列表 54 * @param out 壓縮文件輸出流 55 * @throws RuntimeException 壓縮失敗會拋出運行時異常 56 */ 57 public static void toZip(List<File> srcFiles , OutputStream out)throws RuntimeException { 58 long start = System.currentTimeMillis(); 59 ZipOutputStream zos = null ; 60 try { 61 zos = new ZipOutputStream(out); 62 for (File srcFile : srcFiles) { 63 byte[] buf = new byte[BUFFER_SIZE]; 64 zos.putNextEntry(new ZipEntry(srcFile.getName())); 65 int len; 66 FileInputStream in = new FileInputStream(srcFile); 67 while ((len = in.read(buf)) != -1){ 68 zos.write(buf, 0, len); 69 } 70 zos.closeEntry(); 71 in.close(); 72 } 73 long end = System.currentTimeMillis(); 74 System.out.println("壓縮完成,耗時:" + (end - start) +" ms"); 75 } catch (Exception e) { 76 throw new RuntimeException("zip error from ZipAction",e); 77 }finally{ 78 if(zos != null){ 79 try { 80 zos.close(); 81 } catch (IOException e) { 82 e.printStackTrace(); 83 } 84 } 85 } 86 } 87 /** 88 * 遞歸壓縮方法 89 * @param sourceFile 源文件 90 * @param zos zip輸出流 91 * @param name 壓縮後的名稱 92 * @param KeepDirStructure 是否保留原來的目錄結構,true:保留目錄結構; 93 * false:所有文件跑到壓縮包根目錄下(註意:不保留目錄結構可能會出現同名文件,會壓縮失敗) 94 * @throws Exception 95 */ 96 private static void compress(File sourceFile, ZipOutputStream zos, String name, 97 boolean KeepDirStructure) throws Exception{ 98 byte[] buf = new byte[BUFFER_SIZE]; 99 if(sourceFile.isFile()){ 100 // 向zip輸出流中添加一個zip實體,構造器中name為zip實體的文件的名字 101 zos.putNextEntry(new ZipEntry(name)); 102 // copy文件到zip輸出流中 103 int len; 104 FileInputStream in = new FileInputStream(sourceFile); 105 while ((len = in.read(buf)) != -1){ 106 zos.write(buf, 0, len); 107 } 108 // Complete the entry 109 zos.closeEntry(); 110 in.close(); 111 } else { 112 File[] listFiles = sourceFile.listFiles(); 113 if(listFiles == null || listFiles.length == 0){ 114 // 需要保留原來的文件結構時,需要對空文件夾進行處理 115 if(KeepDirStructure){ 116 // 空文件夾的處理 117 zos.putNextEntry(new ZipEntry(name + "/")); 118 // 沒有文件,不需要文件的copy 119 zos.closeEntry(); 120 } 121 }else { 122 for (File file : listFiles) { 123 // 判斷是否需要保留原來的文件結構 124 if (KeepDirStructure) { 125 // 註意:file.getName()前面需要帶上父文件夾的名字加一斜杠, 126 // 不然最後壓縮包中就不能保留原來的文件結構,即:所有文件都跑到壓縮包根目錄下了 127 compress(file, zos, name + "/" + file.getName(),KeepDirStructure); 128 } else { 129 compress(file, zos, file.getName(),KeepDirStructure); 130 } 131 } 132 } 133 } 134 } 135 public static void main(String[] args) throws Exception { 136 /** 測試壓縮方法1 */ 137 FileOutputStream fos1 = new FileOutputStream(new File("C:/Users/Jason/Desktop/log/innermanage.zip")); 138 ZipAction.toZip("C:/Users/Jason/Desktop/log", fos1,true); 139 /** 測試壓縮方法2 */ 140 List<File> fileList = new ArrayList<>(); 141 fileList.add(new File("C:/Users/Jason/Desktop/log/innermanage/TestAction - 副本.java")); 142 fileList.add(new File("C:/Users/Jason/Desktop/log/innermanage/TestAction.java")); 143 FileOutputStream fos2 = new FileOutputStream(new File("C:/Users/Jason/Desktop/log/test.zip")); 144 ZipAction.toZip(fileList, fos2); 145 } 146 }
簡單測試Demo:如何用Java壓縮文件夾和文件