java玩转zip压缩包

匿名 (未验证) 提交于 2019-12-02 21:52:03

首先将相关jar包引入pom.xml中

1       <!-- 解压zip --> 2         <dependency> 3             <groupId>org.apache.ant</groupId> 4             <artifactId>ant</artifactId> 5             <version>1.9.4</version> 6         </dependency>    

废话不多说,直接上代码

import org.apache.tools.zip.ZipFile; import java.io.*; import java.util.Enumeration; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream;  public class ZipUtils {     private static final int BUFFER_SIZE = 2 * 1024;      /**      * 压缩成ZIP 方法1      * 24      *      * @param srcDir           压缩文件夹路径      * @param out              压缩文件输出流      * @param KeepDirStructure 是否保留原来的目录结构,true:保留目录结构;      *                         false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)      * @throws RuntimeException 压缩失败会抛出运行时异常      */     public static void toZip(String srcDir, OutputStream out, boolean KeepDirStructure)             throws RuntimeException {         long start = System.currentTimeMillis();         ZipOutputStream zos = null;         try {             zos = new ZipOutputStream(out);             File sourceFile = new File(srcDir);             compress(sourceFile, zos, sourceFile.getName(), KeepDirStructure);             long end = System.currentTimeMillis();             System.out.println("压缩完成,耗时:" + (end - start) + " ms");         } catch (Exception e) {             throw new RuntimeException("zip error from ZipUtils", e);         } finally {             if (zos != null) {                 try {                     zos.close();                 } catch (IOException e) {                     e.printStackTrace();                 }             }         }     }      /**      * 压缩成ZIP 方法2      *      * @param srcFiles 需要压缩的文件列表      * @param out      压缩文件输出流      * @throws RuntimeException 压缩失败会抛出运行时异常      */     public static void toZip(List<File> srcFiles, OutputStream out) throws RuntimeException {         long start = System.currentTimeMillis();         ZipOutputStream zos = null;         try {             zos = new ZipOutputStream(out);             for (File srcFile : srcFiles) {                 byte[] buf = new byte[BUFFER_SIZE];                 zos.putNextEntry(new ZipEntry(srcFile.getName()));                 int len;                 FileInputStream in = new FileInputStream(srcFile);                 while ((len = in.read(buf)) != -1) {                     zos.write(buf, 0, len);                 }                 zos.closeEntry();                 in.close();             }             long end = System.currentTimeMillis();             System.out.println("压缩完成,耗时:" + (end - start) + " ms");         } catch (Exception e) {             throw new RuntimeException("zip error from ZipUtils", e);         } finally {             if (zos != null) {                 try {                     zos.close();                 } catch (IOException e) {                     e.printStackTrace();                 }             }         }     }      /**      * 递归压缩方法      *      * @param sourceFile       源文件      * @param zos              zip输出流      * @param name             压缩后的名称      * @param KeepDirStructure 是否保留原来的目录结构,true:保留目录结构;      *                         false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)      * @throws Exception      */     private static void compress(File sourceFile, ZipOutputStream zos, String name,                                  boolean KeepDirStructure) throws Exception {         byte[] buf = new byte[BUFFER_SIZE];         if (sourceFile.isFile()) {             // 向zip输出流中添加一个zip实体,构造器中name为zip实体的文件的名字             zos.putNextEntry(new ZipEntry(name));             // copy文件到zip输出流中             int len;             FileInputStream in = new FileInputStream(sourceFile);             while ((len = in.read(buf)) != -1) {                 zos.write(buf, 0, len);             }             // Complete the entry             zos.closeEntry();             in.close();         } else {             File[] listFiles = sourceFile.listFiles();             if (listFiles == null || listFiles.length == 0) {                 // 需要保留原来的文件结构时,需要对空文件夹进行处理                 if (KeepDirStructure) {                     // 空文件夹的处理                     zos.putNextEntry(new ZipEntry(name + "/"));                     // 没有文件,不需要文件的copy                     zos.closeEntry();                 }             } else {                 for (File file : listFiles) {                     // 判断是否需要保留原来的文件结构                     if (KeepDirStructure) {                         // 注意:file.getName()前面需要带上父文件夹的名字加一斜杠,                         // 不然最后压缩包中就不能保留原来的文件结构,即:所有文件都跑到压缩包根目录下了                         compress(file, zos, name + "/" + file.getName(), KeepDirStructure);                     } else {                         compress(file, zos, file.getName(), KeepDirStructure);                     }                 }              }          }     }      /**      * 解压zip格式的压缩文件到指定位置      *      * @param zipFileName 压缩文件      * @param extPlace    解压目录      * @throws Exception      */     public static boolean unZipFiles(String zipFileName, String extPlace) {         System.setProperty("sun.zip.encoding",                 System.getProperty("sun.jnu.encoding"));         try {             (new File(extPlace)).mkdirs();             File f = new File(zipFileName);             ZipFile zipFile = new ZipFile(zipFileName, "GBK"); // 处理中文文件名乱码的问题             if ((!f.exists()) && (f.length() <= 0)) {                 throw new Exception("要解压的文件不存在!");             }             String strPath, gbkPath, strtemp;             File tempFile = new File(extPlace);             strPath = tempFile.getAbsolutePath();             Enumeration<?> e = zipFile.getEntries();             while (e.hasMoreElements()) {                 org.apache.tools.zip.ZipEntry zipEnt = (org.apache.tools.zip.ZipEntry) e.nextElement();                 gbkPath = zipEnt.getName();                 if (zipEnt.isDirectory()) {                     strtemp = strPath + File.separator + gbkPath;                     File dir = new File(strtemp);                     dir.mkdirs();                     continue;                 } else { // 读写文件                     InputStream is = zipFile.getInputStream(zipEnt);                     BufferedInputStream bis = new BufferedInputStream(is);                     gbkPath = zipEnt.getName();                     strtemp = strPath + File.separator + gbkPath;// 建目录                     String strsubdir = gbkPath;                     for (int i = 0; i < strsubdir.length(); i++) {                         if (strsubdir.substring(i, i + 1).equalsIgnoreCase("/")) {                             String temp = strPath + File.separator                                     + strsubdir.substring(0, i);                             File subdir = new File(temp);                             if (!subdir.exists())                                 subdir.mkdir();                         }                     }                     FileOutputStream fos = new FileOutputStream(strtemp);                     BufferedOutputStream bos = new BufferedOutputStream(fos);                     int c;                     while ((c = bis.read()) != -1) {                         bos.write((byte) c);                     }                     bos.close();                     fos.close();                 }             }             return true;         } catch (Exception e) {             e.printStackTrace();             return false;         }     } }

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!