Browse Source

自动压缩文件

xufei 2 years ago
parent
commit
4901372511

+ 1 - 0
src/main/java/com/winhc/task/util/DateUtils.java

@@ -36,6 +36,7 @@ public class DateUtils {
 
 
     public static void main(String[] args) {
     public static void main(String[] args) {
         System.out.println(getYesterday());
         System.out.println(getYesterday());
+        System.out.println(getYesterday_ymd());
         System.out.println(getMinusDay(30));
         System.out.println(getMinusDay(30));
     }
     }
 }
 }

+ 151 - 0
src/main/java/com/winhc/task/util/ZipUtils.java

@@ -0,0 +1,151 @@
+package com.winhc.task.util;
+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;
+
+
+public class ZipUtils {
+	
+	private static final int  BUFFER_SIZE = 2 * 1024;
+	
+	/**
+	 * 压缩成ZIP 方法1
+	 * @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);
+					}
+					
+				}
+			}
+		}
+	}
+	
+	public static void main(String[] args) throws Exception {
+		/** 测试压缩方法1  */
+		FileOutputStream fos1 = new FileOutputStream(new File("D:\\tmp\\data\\test.zip"));
+		ZipUtils.toZip("D:\\tmp\\data\\20221115\\", fos1,true);
+		
+//		/** 测试压缩方法2  */
+//		List<File> fileList = new ArrayList<>();
+//		fileList.add(new File("D:/Java/jdk1.7.0_45_64bit/bin/jar.exe"));
+//		fileList.add(new File("D:/Java/jdk1.7.0_45_64bit/bin/java.exe"));
+//		FileOutputStream fos2 = new FileOutputStream(new File("c:/mytest02.zip"));
+//		ZipUtils.toZip(fileList, fos2);
+	}
+}

+ 23 - 13
src/test/java/com/winhc/task/TransToExcelNewCompany.java

@@ -7,8 +7,11 @@ import com.winhc.task.bean.Company;
 import com.winhc.task.bean.CompanyOut;
 import com.winhc.task.bean.CompanyOut;
 import com.winhc.task.common.CompanyChangeArgs;
 import com.winhc.task.common.CompanyChangeArgs;
 import com.winhc.task.util.CsvToXlsxUtil;
 import com.winhc.task.util.CsvToXlsxUtil;
+import com.winhc.task.util.ZipUtils;
 
 
 import java.io.File;
 import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
 import java.util.Arrays;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.Collections;
 import java.util.List;
 import java.util.List;
@@ -19,6 +22,7 @@ import java.util.stream.Collectors;
 import static com.winhc.task.common.Constant.*;
 import static com.winhc.task.common.Constant.*;
 import static com.winhc.task.util.CsvToXlsxUtil.jsonToXLSxNewCompany;
 import static com.winhc.task.util.CsvToXlsxUtil.jsonToXLSxNewCompany;
 import static com.winhc.task.util.CsvToXlsxUtil.jsonToXLSxChange;
 import static com.winhc.task.util.CsvToXlsxUtil.jsonToXLSxChange;
+import static com.winhc.task.util.DateUtils.getYesterday_ymd;
 
 
 /**
 /**
  * @author π
  * @author π
@@ -28,28 +32,34 @@ import static com.winhc.task.util.CsvToXlsxUtil.jsonToXLSxChange;
 public class TransToExcelNewCompany {
 public class TransToExcelNewCompany {
 
 
 
 
-    public static void main(String[] args) {
-
-        String ds = "20221114";
+    public static void main(String[] args) throws IOException {
+        String ds = getYesterday_ymd();
+        //ds = "20221114";
+        String outPathPre = "D:\\tmp\\data\\" + ds + "\\";
+        File file = new File(outPathPre);
+        //如果文件夹不存在则会创建
+        if (!file.exists()) file.mkdirs();
         //单个变更维度
         //单个变更维度
         //toTrans(ds,"company_equity_info");
         //toTrans(ds,"company_equity_info");
-        //toTrans(ds,"company");
         //新公司
         //新公司
-        newCompanyToExcel(ds);
+        newCompanyToExcel(outPathPre, ds);
         //变更
         //变更
-        changeToExcel(ds);
+        changeToExcel(outPathPre, ds);
+        //压缩文件
+        FileOutputStream outZipPath = new FileOutputStream(new File("D:\\tmp\\data\\" + ds + ".zip"));
+        ZipUtils.toZip("D:\\tmp\\data\\" + ds, outZipPath, true);
 
 
     }
     }
 
 
-    public static void changeToExcel(String ds) {
+    public static void changeToExcel(String outPathPre, String ds) {
         Map<String, CompanyChangeArgs> exportArgs = CompanyChangeArgs.EXPORT_ARGS;
         Map<String, CompanyChangeArgs> exportArgs = CompanyChangeArgs.EXPORT_ARGS;
         exportArgs.keySet().forEach(tn -> {
         exportArgs.keySet().forEach(tn -> {
-            toTrans(ds, tn);
+            toTrans(outPathPre, ds, tn);
         });
         });
 
 
     }
     }
 
 
-    private static void toTrans(String ds, String tn) {
+    private static void toTrans(String outPathPre, String ds, String tn) {
         Map<String, CompanyChangeArgs> exportArgs = CompanyChangeArgs.EXPORT_ARGS;
         Map<String, CompanyChangeArgs> exportArgs = CompanyChangeArgs.EXPORT_ARGS;
         CompanyChangeArgs args = exportArgs.get(tn);
         CompanyChangeArgs args = exportArgs.get(tn);
         Function<JSONObject, JSONObject> handles = args.getHandles();
         Function<JSONObject, JSONObject> handles = args.getHandles();
@@ -57,11 +67,12 @@ public class TransToExcelNewCompany {
                 .map(Collections::singletonList)
                 .map(Collections::singletonList)
                 .collect(Collectors.toList());
                 .collect(Collectors.toList());
         String objectName = "anshuo/dim_change/" + ds + "/" + tn + ".json";
         String objectName = "anshuo/dim_change/" + ds + "/" + tn + ".json";
-        String outPath = "D:\\tmp\\data\\change_" + tn + ".xlsx";
-        jsonToXLSxChange(tn, outPath, objectName, company_head_list, args.getClazz(),handles);
+        //String outPath = "D:\\tmp\\data\\change_" + tn + ".xlsx";
+        String outPath = outPathPre + "change_" + tn + ".xlsx";
+        jsonToXLSxChange(tn, outPath, objectName, company_head_list, args.getClazz(), handles);
     }
     }
 
 
-    public static void newCompanyToExcel(String ds) {
+    public static void newCompanyToExcel(String outPathPre, String ds) {
 
 
         List<List<String>> company_head_list = Arrays.stream(company_head.split("@"))
         List<List<String>> company_head_list = Arrays.stream(company_head.split("@"))
                 .map(Collections::singletonList)
                 .map(Collections::singletonList)
@@ -76,7 +87,6 @@ public class TransToExcelNewCompany {
                 .collect(Collectors.toList());
                 .collect(Collectors.toList());
 
 
         String objectName = "anshuo/new_company/" + ds + "/new_company.json";
         String objectName = "anshuo/new_company/" + ds + "/new_company.json";
-        String outPathPre = "D:\\tmp\\data\\";
 
 
         jsonToXLSxNewCompany(outPathPre, objectName, company_head_list, holder_head_list, staff_head_list);
         jsonToXLSxNewCompany(outPathPre, objectName, company_head_list, holder_head_list, staff_head_list);
     }
     }