From 8140ed1a126b85afd56c79599858a53e9826d519 Mon Sep 17 00:00:00 2001 From: yjz <3131811435@qq.com> Date: Thu, 19 Oct 2023 15:10:52 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E6=96=87=E6=A1=A3=E6=8B=86=E5=88=86):=20?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E5=AF=BC=E5=85=A5=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/jero/common/util/FileUtils.java | 53 +++ .../java/com/jero/common/util/ZipUtil.java | 309 ++++++++++++++++++ 2 files changed, 362 insertions(+) create mode 100644 laws-base/laws-base-core/src/main/java/com/jero/common/util/FileUtils.java create mode 100644 laws-base/laws-base-core/src/main/java/com/jero/common/util/ZipUtil.java diff --git a/laws-base/laws-base-core/src/main/java/com/jero/common/util/FileUtils.java b/laws-base/laws-base-core/src/main/java/com/jero/common/util/FileUtils.java new file mode 100644 index 00000000..285fdccc --- /dev/null +++ b/laws-base/laws-base-core/src/main/java/com/jero/common/util/FileUtils.java @@ -0,0 +1,53 @@ +/** + * @Author: Greyfus + * @Create: 2022-06-26 19:24 + * @Version: + * @Description: + */ +package com.jero.common.util; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.nio.file.*; +import java.nio.file.attribute.BasicFileAttributes; + +public class FileUtils { + + private FileUtils() { + throw new IllegalStateException("FileUtils class"); + } + private static final Logger LOGGER = LoggerFactory.getLogger(FileUtils.class); + + /** + * 删除指定文件夹下文件 + * + * @param filePath + */ + public static void deleteFolders(String filePath) { + + Path path = Paths.get(filePath); + try { + Files.walkFileTree(path, new SimpleFileVisitor() { + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attributes) throws IOException { + Files.delete(file); + LOGGER.info("删除文件: {}", file); + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult postVisitDirectory(Path dir, + IOException exc) throws IOException { + Files.delete(dir); + LOGGER.info("文件夹被删除: {}", dir); + return FileVisitResult.CONTINUE; + } + }); + } catch (IOException e) { + e.printStackTrace(); + } + } +} + diff --git a/laws-base/laws-base-core/src/main/java/com/jero/common/util/ZipUtil.java b/laws-base/laws-base-core/src/main/java/com/jero/common/util/ZipUtil.java new file mode 100644 index 00000000..5ba03939 --- /dev/null +++ b/laws-base/laws-base-core/src/main/java/com/jero/common/util/ZipUtil.java @@ -0,0 +1,309 @@ +package com.jero.common.util; + +import lombok.extern.slf4j.Slf4j; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; +import java.util.zip.ZipOutputStream; + +@Slf4j +public class ZipUtil { + + 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, HttpServletResponse response, 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 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 file zip压缩包文件 + * @param response 响应 + * @author liukai + */ + public static void downloadZip(File file, HttpServletResponse response) { + OutputStream toClient = null; + try { + // 以流的形式下载文件。 + BufferedInputStream fis = new BufferedInputStream(new FileInputStream(file.getPath())); + byte[] buffer = new byte[fis.available()]; + fis.read(buffer); + fis.close(); + // 清空response + response.reset(); + toClient = new BufferedOutputStream(response.getOutputStream()); + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/octet-stream"); + response.setHeader("Content-Disposition", "attachment;filename=" + file.getName()); + toClient.write(buffer); + toClient.flush(); + } catch (Exception e) { + System.out.println("下载zip压缩包过程发生异常"); + } finally { + if (toClient != null) { + try { + toClient.close(); + } catch (IOException e) { + System.out.println("zip包下载关流失败"); + } + } + } + } + + + /** + * zip解压 + * + * @param srcFile zip源文件 + * @param destDirPath 解压后的目标文件夹 + * @throws RuntimeException 解压失败会抛出运行时异常 + */ + public static List unZip(File srcFile, String destDirPath) throws RuntimeException { + + //记录解压出来的所有文件名 + List filesName = new ArrayList<>(); + long start = System.currentTimeMillis(); + // 判断源文件是否存在 + if (!srcFile.exists()) { + throw new RuntimeException(srcFile.getPath() + "所指文件不存在"); + } + // 开始解压 + ZipFile zipFile = null; + try { + zipFile = new ZipFile(srcFile, Charset.forName("GBK")); + Enumeration entries = zipFile.entries(); + + while (entries.hasMoreElements()) { + ZipEntry entry = (ZipEntry) entries.nextElement(); + + // System.out.println("解压文件:" + entry.getName()); + // 如果是文件夹,就创建个文件夹 + if (entry.isDirectory()) { + String dirPath = destDirPath + "/" + entry.getName(); + File dir = new File(dirPath); + dir.mkdirs(); + } else { + //添加进filesName + filesName.add(entry.getName()); + // 如果是文件,就先创建一个文件,然后用io流把内容copy过去 + File targetFile = new File(destDirPath + "/" + entry.getName()); + // 保证这个文件的父文件夹必须要存在 + if (!targetFile.getParentFile().exists()) { + targetFile.getParentFile().mkdirs(); + } + targetFile.createNewFile(); + // 将压缩文件内容写入到这个文件中 + InputStream is = zipFile.getInputStream(entry); + FileOutputStream fos = new FileOutputStream(targetFile); + int len; + byte[] buf = new byte[1024]; + while ((len = is.read(buf)) != -1) { + fos.write(buf, 0, len); + } + // 关流顺序,先打开的后关闭 + fos.close(); + is.close(); + } + } + long end = System.currentTimeMillis(); + System.out.println("解压完成,耗时:" + (end - start) + " ms"); + } catch (Exception e) { + throw new RuntimeException("unzip error from ZipUtils", e); + } finally { + if (zipFile != null) { + try { + zipFile.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return filesName; + } + + + /** + * 删除文件 + * + * @param filePath + * @return + */ + public static boolean deleteFile(String filePath) { + boolean flag = false; + File file = new File(filePath); + if (!file.exists()) { + return flag; + } + if (!file.isDirectory()) { + return flag; + } + String[] tempList = file.list(); + File temp; + for (int i = 0; i < tempList.length; i++) { + if (filePath.endsWith(File.separator)) { + temp = new File(filePath + tempList[i]); + } else { + temp = new File(filePath + File.separator + tempList[i]); + } + if (temp.isFile()) { + temp.delete(); + } + if (temp.isDirectory()) { + // 先删除文件夹里面的文件 + deleteFile(filePath + "/" + tempList[i]); + // 再删除空文件夹 + deleteFile(filePath + "/" + tempList[i]); + flag = true; + } + } + return flag; + } + + /** + * 删除zip + * + * @param filePath + * @return + */ + public static void deleteZip(String filePath) { + File file = new File(filePath); + // zip文件 判断 是否存在 + if (file.getName().endsWith(".zip")) { + if (file.delete()) { + log.info("zip文件已经删除"); + } else { + log.info("zip文件删除失败"); + } + } + } +} \ No newline at end of file