Die Funktionen dieses Tools sind:
(1) Es kann Dateien und Ordner komprimieren
(2) Unterstützt Komprimieren Sie mehrstufige Ordner gleichzeitig und das Tool führt eine rekursive Verarbeitung im Inneren durch
(3) Wenn Sie auf einen leeren Ordner stoßen, können Sie ihn auch komprimieren
(4) Sie können wählen, ob die ursprüngliche Verzeichnisstruktur beibehalten werden soll. Andernfalls werden alle Dateien in das Stammverzeichnis des komprimierten Pakets verschoben und leere Ordner werden direkt verworfen. Hinweis: Wenn die ursprüngliche Verzeichnisstruktur der Datei nicht beibehalten wird, schlägt die Komprimierung fehl, wenn Dateien mit demselben Dateinamen gefunden werden.
(5) Der Code bietet zwei Methoden zum Komprimieren von Dateien. Der Eingabeparameter ist der Ordnerpfad und der andere die Dateiliste. Die Methode kann entsprechend den tatsächlichen Anforderungen ausgewählt werden .
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 }
Verwandte Artikel:
PHP-Code zum Komprimieren eines Ordners in eine ZIP-Datei
PHP-Code zum Komprimieren eines Ordners in eine ZIP-Datei PHP-Code
Das obige ist der detaillierte Inhalt vonJava-Praxisfall: Tool-Klasse zum Komprimieren von Dateien oder Ordnern in zip. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!