Home >Java >javaTutorial >Java practical case: Tool class for compressing files or folders into zip
The functions of this tool class are:
(1) It can compress files and folders
( 2) Supports compressing multi-level folders at the same time, and the tool does recursive processing
(3) When encountering an empty folder, it can also be compressed
(4) You can choose whether to retain the original directory structure. If not, all files will go to the root directory of the compressed package, and empty folders will be discarded directly. Note: If the original directory structure of the file is not retained, compression will fail when files with the same file name are encountered.
(5) The code provides two methods for compressing files. The input parameter of one is the folder path and the other is the file list. The method can be selected according to actual needs.
package com.tax.core.util; 2 import java.io.File; 3 import java.io.FileInputStream; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 import java.io.OutputStream; 7 import java.util.ArrayList; 8 import java.util.List; 9 import java.util.zip.ZipEntry; 10 import java.util.zip.ZipOutputStream; 11 12 /** 13 * ZipUtils 14 * @author ZENG.XIAO.YAN 15 * @date 2017年11月19日 下午7:16:08 16 * @version v1.0 17 */ 18 public class ZipUtils { 19 20 private static final int BUFFER_SIZE = 2 * 1024; 21 22 /** 23 * 压缩成ZIP 方法1 24 * @param srcDir 压缩文件夹路径 25 * @param out 压缩文件输出流 26 * @param KeepDirStructure 是否保留原来的目录结构,true:保留目录结构; 27 * false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败) 28 * @throws RuntimeException 压缩失败会抛出运行时异常 29 */ 30 public static void toZip(String srcDir, OutputStream out, boolean KeepDirStructure) 31 throws RuntimeException{ 32 33 long start = System.currentTimeMillis(); 34 ZipOutputStream zos = null ; 35 try { 36 zos = new ZipOutputStream(out); 37 File sourceFile = new File(srcDir); 38 compress(sourceFile,zos,sourceFile.getName(),KeepDirStructure); 39 long end = System.currentTimeMillis(); 40 System.out.println("压缩完成,耗时:" + (end - start) +" ms"); 41 } catch (Exception e) { 42 throw new RuntimeException("zip error from ZipUtils",e); 43 }finally{ 44 if(zos != null){ 45 try { 46 zos.close(); 47 } catch (IOException e) { 48 e.printStackTrace(); 49 } 50 } 51 } 52 53 } 54 55 /** 56 * 压缩成ZIP 方法2 57 * @param srcFiles 需要压缩的文件列表 58 * @param out 压缩文件输出流 59 * @throws RuntimeException 压缩失败会抛出运行时异常 60 */ 61 public static void toZip(List<File> srcFiles , OutputStream out)throws RuntimeException { 62 long start = System.currentTimeMillis(); 63 ZipOutputStream zos = null ; 64 try { 65 zos = new ZipOutputStream(out); 66 for (File srcFile : srcFiles) { 67 byte[] buf = new byte[BUFFER_SIZE]; 68 zos.putNextEntry(new ZipEntry(srcFile.getName())); 69 int len; 70 FileInputStream in = new FileInputStream(srcFile); 71 while ((len = in.read(buf)) != -1){ 72 zos.write(buf, 0, len); 73 } 74 zos.closeEntry(); 75 in.close(); 76 } 77 long end = System.currentTimeMillis(); 78 System.out.println("压缩完成,耗时:" + (end - start) +" ms"); 79 } catch (Exception e) { 80 throw new RuntimeException("zip error from ZipUtils",e); 81 }finally{ 82 if(zos != null){ 83 try { 84 zos.close(); 85 } catch (IOException e) { 86 e.printStackTrace(); 87 } 88 } 89 } 90 } 91 92 93 /** 94 * 递归压缩方法 95 * @param sourceFile 源文件 96 * @param zos zip输出流 97 * @param name 压缩后的名称 98 * @param KeepDirStructure 是否保留原来的目录结构,true:保留目录结构; 99 * false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败) 100 * @throws Exception 101 */ 102 private static void compress(File sourceFile, ZipOutputStream zos, String name, 103 boolean KeepDirStructure) throws Exception{ 104 byte[] buf = new byte[BUFFER_SIZE]; 105 if(sourceFile.isFile()){ 106 // 向zip输出流中添加一个zip实体,构造器中name为zip实体的文件的名字 107 zos.putNextEntry(new ZipEntry(name)); 108 // copy文件到zip输出流中 109 int len; 110 FileInputStream in = new FileInputStream(sourceFile); 111 while ((len = in.read(buf)) != -1){ 112 zos.write(buf, 0, len); 113 } 114 // Complete the entry 115 zos.closeEntry(); 116 in.close(); 117 } else { 118 File[] listFiles = sourceFile.listFiles(); 119 if(listFiles == null || listFiles.length == 0){ 120 // 需要保留原来的文件结构时,需要对空文件夹进行处理 121 if(KeepDirStructure){ 122 // 空文件夹的处理 123 zos.putNextEntry(new ZipEntry(name + "/")); 124 // 没有文件,不需要文件的copy 125 zos.closeEntry(); 126 } 127 128 }else { 129 for (File file : listFiles) { 130 // 判断是否需要保留原来的文件结构 131 if (KeepDirStructure) { 132 // 注意:file.getName()前面需要带上父文件夹的名字加一斜杠, 133 // 不然最后压缩包中就不能保留原来的文件结构,即:所有文件都跑到压缩包根目录下了 134 compress(file, zos, name + "/" + file.getName(),KeepDirStructure); 135 } else { 136 compress(file, zos, file.getName(),KeepDirStructure); 137 } 138 139 } 140 } 141 } 142 } 143 144 public static void main(String[] args) throws Exception { 145 /** 测试压缩方法1 */ 146 FileOutputStream fos1 = new FileOutputStream(new File("c:/mytest01.zip")); 147 ZipUtils.toZip("D:/log", fos1,true); 148 149 /** 测试压缩方法2 */ 150 List<File> fileList = new ArrayList<>(); 151 fileList.add(new File("D:/Java/jdk1.7.0_45_64bit/bin/jar.exe")); 152 fileList.add(new File("D:/Java/jdk1.7.0_45_64bit/bin/java.exe")); 153 FileOutputStream fos2 = new FileOutputStream(new File("c:/mytest02.zip")); 154 ZipUtils.toZip(fileList, fos2); 155 } 156 }
Related articles:
php code to compress a folder into a zip file
php code to compress a folder into a zip file php code
The above is the detailed content of Java practical case: Tool class for compressing files or folders into zip. For more information, please follow other related articles on the PHP Chinese website!