A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

package com.cn;


import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;


/**
* 压缩.zip文件类
* 创建者    :  xxx
* 创建日期: 2018年06月29日
* */
public class ZipCompressorByAnt {
        private static final int BUFFER_SIZE = 2 * 1024;


       /**
          * @param srcDir 压缩文件夹路径
          * @param out 压缩文件输出流
          * @param KeepDirStructure 是否保留原来的目录结构,
          *  true:保留目录结构;
          *  false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)
          * @throws RuntimeException 压缩失败会抛出运行时异常
          */
          public static boolean toZip(String[] srcDir, String outDir,boolean KeepDirStructure)

               throws RuntimeException, Exception {

                  OutputStream out = new FileOutputStream(new File(outDir));
                  long start = System.currentTimeMillis();
                  ZipOutputStream zos = null;
                  try {
                       zos = new ZipOutputStream(out);
                       List<File> sourceFileList = new ArrayList<File>();
                       for (String dir : srcDir) {
                            File sourceFile = new File(dir);
                            sourceFileList.add(sourceFile);
                       }
                      compress(sourceFileList, zos, 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();
                             }
                        }
                    }
            }


         /**
           * 递归压缩方法
           * @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()) {
                          zos.putNextEntry(new ZipEntry(name));
                          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 + "/"));
                                       zos.closeEntry();
                                }
                         } else {
                                for (File file : listFiles) {
                                      if (KeepDirStructure) {
                                           compress(file, zos, name + "/" + file.getName(),
                                           KeepDirStructure);
                                      } else {
                                           compress(file, zos, file.getName(), KeepDirStructure);
                                      }

                                 }                  

                          }
                    }
            }


            private static void compress(List<File> sourceFileList,
                ZipOutputStream zos, boolean KeepDirStructure) throws Exception {
                byte[] buf = new byte[BUFFER_SIZE];
                for (File sourceFile : sourceFileList) {
                         String name = sourceFile.getName();
                         if (sourceFile.isFile()) {
                                 zos.putNextEntry(new ZipEntry(name));
                                 int len;
                                 FileInputStream in = new FileInputStream(sourceFile);
                                 while ((len = in.read(buf)) != -1) {
                                            zos.write(buf, 0, len);
                                  }
                                  zos.closeEntry();
                                 in.close();
                           } else {
                                 File[] listFiles = sourceFile.listFiles();
                                 if (listFiles == null || listFiles.length == 0) {
                                         if (KeepDirStructure) {
                                                zos.putNextEntry(new ZipEntry(name + "/"));
                                                zos.closeEntry();
                                         }
                                 } else {
                                         for (File file : listFiles) {
                                                if (KeepDirStructure) {
                                                       compress(file, zos, name + "/" + file.getName(),
                                                       KeepDirStructure);
                                                 } else {
                                                       compress(file, zos, file.getName(),
                                                       KeepDirStructure);
                                                 }
                                          }
                                 }
                           }
                    }
            }



            public static void main(String[] args) throws Exception{
                String pathFile="E:\\Files";//文件夹路径
                    String mainXmlPath="E:\\1.xml";//文件路径
                    String metaXmlPath="E:\\2.xml";//文件路径
                String[] srcDir = { pathFile,mainXmlPath,metaXmlPath};
                String outDir="E:\\mytest.zip";//压缩后的.zip路径
                toZip(srcDir, outDir, true);
            }
}

压缩前效果图:


---------------------
【转载,仅作分享,侵删】
作者:小志的博客
原文:https://blog.csdn.net/li1325169021/article/details/80732278
版权声明:本文为博主原创文章,转载请附上博文链接!

1 个回复

倒序浏览
奈斯,感谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马