Les fonctions de cet outil sont :
(1) Il peut compresser des fichiers et des dossiers
(2) Supports compressant des dossiers à plusieurs niveaux en même temps, et l'outil effectue un traitement récursif à l'intérieur de
(3) Lorsque vous rencontrez un dossier vide, vous pouvez également le compresser
(4) Vous pouvez choisir de conserver la structure de répertoires d'origine. Sinon, tous les fichiers iront dans le répertoire racine du package compressé et les dossiers vides seront directement supprimés. Remarque : Si la structure de répertoires d'origine du fichier n'est pas conservée, la compression échouera lorsque des fichiers portant le même nom de fichier seront rencontrés.
(5) Le code fournit deux méthodes pour compresser les fichiers. Le paramètre d'entrée de l'une est le chemin du dossier et l'autre est la liste des fichiers. La méthode peut être sélectionnée en fonction des besoins réels. .
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 }
Articles associés :
Code php pour compresser un dossier dans un fichier zip
Code php pour compresser un dossier dans un fichier zip code php
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!