|
@@ -0,0 +1,150 @@
|
|
|
|
+package com.management.platform.util;
|
|
|
|
+
|
|
|
|
+import com.alibaba.excel.util.StringUtils;
|
|
|
|
+import org.slf4j.Logger;
|
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
|
+
|
|
|
|
+import java.io.*;
|
|
|
|
+import java.util.Enumeration;
|
|
|
|
+import java.util.zip.*;
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * @Description 压缩与解压工具
|
|
|
|
+ * @Author yanghanwei
|
|
|
|
+ * @Date 18:42 2019-11-20
|
|
|
|
+ * @Version v1
|
|
|
|
+ **/
|
|
|
|
+public class ZipUtils {
|
|
|
|
+
|
|
|
|
+ private static final Logger logger = LoggerFactory.getLogger(ZipUtils.class);
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 压缩 zip
|
|
|
|
+ * @param filePath 文件夹 全路径
|
|
|
|
+ * @param fileName 文件夹名称
|
|
|
|
+ * @param outPath 压缩文件保存路径
|
|
|
|
+ */
|
|
|
|
+ public static void zipFile(String filePath, String fileName, String outPath) {
|
|
|
|
+ logger.info("filePath:{}, fileName:{}, outPath:{}", filePath, fileName, outPath);
|
|
|
|
+ try {
|
|
|
|
+ //创建Test.zip文件
|
|
|
|
+ OutputStream is = new FileOutputStream(outPath);
|
|
|
|
+ //检查输出流,采用CRC32算法,保证文件的一致性
|
|
|
|
+ CheckedOutputStream cos = new CheckedOutputStream(is, new CRC32());
|
|
|
|
+ //创建zip文件的输出流
|
|
|
|
+ ZipOutputStream zos = new ZipOutputStream(cos);
|
|
|
|
+ //需要压缩的文件或文件夹对象
|
|
|
|
+ File file = new File(filePath);
|
|
|
|
+ //压缩文件的具体实现函数
|
|
|
|
+ zipFilePost(zos,file,filePath,fileName,outPath);
|
|
|
|
+ zos.close();
|
|
|
|
+ cos.close();
|
|
|
|
+ is.close();
|
|
|
|
+ System.out.println("压缩完成");
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ logger.error("压缩失败zipFile,Exception:" + e);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 压缩文件
|
|
|
|
+ * @param zos zip文件的输出流
|
|
|
|
+ * @param file 需要压缩的文件或文件夹对象
|
|
|
|
+ * @param filePath 压缩的文件路径
|
|
|
|
+ * @param fileName 需要压缩的文件夹名
|
|
|
|
+ * @param outPath 缩完成后保存为Test.zip文件
|
|
|
|
+ */
|
|
|
|
+ private static void zipFilePost(ZipOutputStream zos, File file, String filePath, String fileName, String outPath){
|
|
|
|
+
|
|
|
|
+ try{
|
|
|
|
+ String path = file.getPath();
|
|
|
|
+ String zosName = "";
|
|
|
|
+ if(!StringUtils.isEmpty(path)){
|
|
|
|
+ zosName = path.substring(path.indexOf(fileName));
|
|
|
|
+ }
|
|
|
|
+ File[] files = file.listFiles();
|
|
|
|
+ if(file.isDirectory() && files != null && files.length > 0) {
|
|
|
|
+ // 创建压缩文件的目录结构
|
|
|
|
+ zos.putNextEntry(new ZipEntry(zosName + File.separator));
|
|
|
|
+ for(File f : files) {
|
|
|
|
+ zipFilePost(zos, f, filePath, fileName, outPath);
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ logger.info("正在压缩文件:{}",file.getName());
|
|
|
|
+ // 创建压缩文件
|
|
|
|
+ zos.putNextEntry(new ZipEntry(zosName));
|
|
|
|
+ // 用字节方式读取源文件
|
|
|
|
+ InputStream is = new FileInputStream(file.getPath());
|
|
|
|
+ // 创建一个缓存区
|
|
|
|
+ BufferedInputStream bis = new BufferedInputStream(is);
|
|
|
|
+ // 字节数组,每次读取1024个字节
|
|
|
|
+ byte [] b = new byte[1024];
|
|
|
|
+ // 循环读取,边读边写
|
|
|
|
+ while(bis.read(b)!=-1) {
|
|
|
|
+ // 写入压缩文件
|
|
|
|
+ zos.write(b);
|
|
|
|
+ }
|
|
|
|
+ //关闭流
|
|
|
|
+ bis.close();
|
|
|
|
+ is.close();
|
|
|
|
+ }
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ logger.error("压缩文件失败zipFilePost,Exception:" + e);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public static void unzip(String sourcePath, String targetPath) {
|
|
|
|
+ //targetPath输出文件路径
|
|
|
|
+ File targetFile = new File(targetPath);
|
|
|
|
+ // 如果目录不存在,则创建
|
|
|
|
+ if (!targetFile.exists()) {
|
|
|
|
+ targetFile.mkdirs();
|
|
|
|
+ }
|
|
|
|
+ //sourcePath压缩包文件路径
|
|
|
|
+ try (ZipFile zipFile = new ZipFile(new File(sourcePath))) {
|
|
|
|
+ System.out.println("file nums:" + zipFile.size());
|
|
|
|
+ Enumeration enumeration = zipFile.entries();
|
|
|
|
+ while (enumeration.hasMoreElements()) {
|
|
|
|
+ //依次获取压缩包内的文件实体对象
|
|
|
|
+ ZipEntry entry = (ZipEntry) enumeration.nextElement();
|
|
|
|
+ String name = entry.getName();
|
|
|
|
+ if (entry.isDirectory()) {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ try (BufferedInputStream inputStream = new BufferedInputStream(zipFile.getInputStream(entry))) {
|
|
|
|
+ // 需要判断文件所在的目录是否存在,处理压缩包里面有文件夹的情况
|
|
|
|
+ String outName = targetPath + "/" + name;
|
|
|
|
+ File outFile = new File(outName);
|
|
|
|
+ File tempFile = new File(outName.substring(0, outName.lastIndexOf("/")));
|
|
|
|
+ if (!tempFile.exists()) {
|
|
|
|
+ tempFile.mkdirs();
|
|
|
|
+ }
|
|
|
|
+ try (BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(outFile))) {
|
|
|
|
+ int len;
|
|
|
|
+ byte[] buffer = new byte[1024];
|
|
|
|
+ while ((len = inputStream.read(buffer)) > 0) {
|
|
|
|
+ outputStream.write(buffer, 0, len);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ public static void main(String[] args) throws Exception{
|
|
|
|
+// String filePath = "/var/folders/88/jh37h0fj59l1f302jdryz4780000gn/T/201908月小微平台消耗-1574300435525/";
|
|
|
|
+// // 需要压缩的文件夹名
|
|
|
|
+// String fileName = "201908月小微平台消耗-1574300435525";
|
|
|
|
+// // 压缩完成后保存为Test.zip文件,名字随意
|
|
|
|
+// String outPath = "/var/folders/88/jh37h0fj59l1f302jdryz4780000gn/T/Test3.zip";
|
|
|
|
+// zipFile(filePath, fileName, outPath);
|
|
|
|
+
|
|
|
|
+ String sourcePath = "C:\\gitproject\\manHourHousekeeper\\fhKeeper\\formulahousekeeper\\timesheet-workshop\\distPC.zip";
|
|
|
|
+ String targetPath = "C:\\文档资料\\distPC";
|
|
|
|
+ unzip(sourcePath, targetPath);
|
|
|
|
+ }
|
|
|
|
+}
|