Java基础-实现zip解压缩

2023-10-30

可实现: 文件、文件夹的解压缩操作

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.Charset;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 文件压缩工具类
 */
public class ZipUtil {
	private static final int BUFFER_SIZE = 2 * 1024;
	/**
	 * 是否保留原来的目录结构
	 * true:  保留目录结构;
	 * false: 所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)
	 */
	private static final boolean KeepDirStructure = true;
	private static final Logger log = LoggerFactory.getLogger(ZipUtil.class);
	
	public static void main(String[] args) {
		try {
			toZip("E:/app1", "E:/app.zip",true);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 压缩成ZIP
	 * @param srcDir         压缩 文件/文件夹 路径
	 * @param outPathFile    压缩 文件/文件夹 输出路径+文件名 D:/xx.zip
	 * @param isDelSrcFile   是否删除原文件: 压缩前文件
	 */
	public static void toZip(String srcDir, String outPathFile,boolean isDelSrcFile) throws Exception {
		long start = System.currentTimeMillis();
		FileOutputStream out = null; 
		ZipOutputStream zos = null;
		try {
			out = new FileOutputStream(new File(outPathFile));
			zos = new ZipOutputStream(out);
			File sourceFile = new File(srcDir);
			if(!sourceFile.exists()){
				throw new Exception("需压缩文件或者文件夹不存在");
			}
			compress(sourceFile, zos, sourceFile.getName());
			if(isDelSrcFile){
				delDir(srcDir);
			}
			log.info("原文件:{}. 压缩到:{}完成. 是否删除原文件:{}. 耗时:{}ms. ",srcDir,outPathFile,isDelSrcFile,System.currentTimeMillis()-start);
		} catch (Exception e) {
			log.error("zip error from ZipUtils: {}. ",e.getMessage());
			throw new Exception("zip error from ZipUtils");
		} finally {
			try {
				if (zos != null) {zos.close();}
				if (out != null) {out.close();}
			} catch (Exception e) {}
		}
	}

	/**
	 * 递归压缩方法
	 * @param sourceFile 源文件
	 * @param zos zip输出流
	 * @param name 压缩后的名称
	 */
	private static void compress(File sourceFile, ZipOutputStream zos, String name)
			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);
			}
			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());
					} else {
						compress(file, zos, file.getName());
					}
				}
			}
		}
	}
	
	/**
	 * 解压文件到指定目录
	 */
	@SuppressWarnings({ "rawtypes", "resource" })
	public static void unZipFiles(String zipPath, String descDir) throws IOException {
		log.info("文件:{}. 解压路径:{}. 解压开始.",zipPath,descDir);
		long start = System.currentTimeMillis();
		try{
			File zipFile = new File(zipPath);
			System.err.println(zipFile.getName());
			if(!zipFile.exists()){
				throw new IOException("需解压文件不存在.");
			}
			File pathFile = new File(descDir);
			if (!pathFile.exists()) {
				pathFile.mkdirs();
			}
			ZipFile zip = new ZipFile(zipFile, Charset.forName("GBK"));
			for (Enumeration entries = zip.entries(); entries.hasMoreElements();) {
				ZipEntry entry = (ZipEntry) entries.nextElement();
				String zipEntryName = entry.getName();
				System.err.println(zipEntryName);
				InputStream in = zip.getInputStream(entry);
				String outPath = (descDir + File.separator + zipEntryName).replaceAll("\\*", "/");
				System.err.println(outPath);
				// 判断路径是否存在,不存在则创建文件路径
				File file = new File(outPath.substring(0, outPath.lastIndexOf('/')));
				if (!file.exists()) {
					file.mkdirs();
				}
				// 判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压
				if (new File(outPath).isDirectory()) {
					continue;
				}
				// 输出文件路径信息
				OutputStream out = new FileOutputStream(outPath);
				byte[] buf1 = new byte[1024];
				int len;
				while ((len = in.read(buf1)) > 0) {
					out.write(buf1, 0, len);
				}
				in.close();
				out.close();
			}
			log.info("文件:{}. 解压路径:{}. 解压完成. 耗时:{}ms. ",zipPath,descDir,System.currentTimeMillis()-start);
		}catch(Exception e){
			log.info("文件:{}. 解压路径:{}. 解压异常:{}. 耗时:{}ms. ",zipPath,descDir,e,System.currentTimeMillis()-start);
			throw new IOException(e);
		}
	}
	
	// 删除文件或文件夹以及文件夹下所有文件
	public static void delDir(String dirPath) throws IOException {
		log.info("删除文件开始:{}.",dirPath);
		long start = System.currentTimeMillis();
		try{
			File dirFile = new File(dirPath);
			if (!dirFile.exists()) {
				return;
			}
			if (dirFile.isFile()) {
				dirFile.delete();
				return;
			}
			File[] files = dirFile.listFiles();
			if(files==null){
				return;
			}
			for (int i = 0; i < files.length; i++) {
				delDir(files[i].toString());
			}
			dirFile.delete();
			log.info("删除文件:{}. 耗时:{}ms. ",dirPath,System.currentTimeMillis()-start);
		}catch(Exception e){
			log.info("删除文件:{}. 异常:{}. 耗时:{}ms. ",dirPath,e,System.currentTimeMillis()-start);
			throw new IOException("删除文件异常.");
		}
	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java基础-实现zip解压缩 的相关文章

  • 如何在 Xamarin for Android 中压缩文件?

    我有一个函数可以创建一个 zip 文件和传递的文件字符串数组 该函数确实成功创建了 zip 文件及其内部的 zip 条目文件 但这些 zip 条目文件是空的 我尝试了几种不同的方法 下面的函数代码是我最接近的工作代码 public stat
  • 如何使用 JSZip 使用 Node.js 中的缓冲区内容生成 zip 文件?

    我有一个字符串数组 应将其写入 txt 文件 另外 我需要使用 JSZip 将生成的 txt 文件压缩为 zip 格式 在客户端 我能够使用该字符串数组生成 文本 纯文本 Blob 然后使用 JSZip 将此 Blob 压缩为 zip 格式
  • 更新 ZipArchive 中的文件

    我有一个 ZipArchive 对象 其中包含我正在修改的 XML 文件 然后我想返回修改后的 ZipArchive 这是我的代码 var package File ReadAllBytes location of existing zip
  • Zip 文件包含相同的文件但具有不同的哈希值?

    我使用 php 创建了数百个文件夹和文本文件 然后将它们添加到 zip 存档中 这一切都工作正常 但如果我使用相同的文件夹和文件创建另一个 zip 存档 新存档将具有与第一个存档不同的哈希值 如果我使用 winrar 而不是 php 创建存
  • 如何在android中压缩文件夹以制作docx文件?

    我正在尝试制作一个 Android 应用程序 可以打开 docx 文件来读取 编辑和保存它 我的想法是将存档中的所有 xml 文件提取到临时文件夹中 在这个文件夹中我们可以编辑docx的内容 word document xml 问题是当我压
  • 将 tar.gz 转换为 zip

    我的 Ubuntu 网络服务器上有大量 gzip 压缩档案 我需要将它们转换为 zip 我认为这可以通过脚本来完成 但是我应该使用什么语言 以及如何解压缩和重新压缩文件 我会用一个bash 1 单行 for f in tar gz do r
  • 使用 PHP 提取 .zip 文件 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如何使用 PHP 提取 zip 10
  • ZipInputStream.getNextEntry() 如何工作?

    假设我们有这样的代码 File file new File zip1 zip ZipInputStream zis new ZipInputStream new FileInputStream file 假设您有一个包含以下内容的 zip
  • 如何有效地将许多文件移动到新服务器?

    我正在更换托管提供商 需要将数百万个上传的文件传输到新服务器 所有文件都位于同一目录中 是的 你读对了 过去我这样做过 压缩源服务器中的所有文件 scp到新服务器的 zip Unzip Move directory to appropria
  • 如何在 Python 中仅列出 zip 存档中的文件夹?

    如何仅列出 zip 存档中的文件夹 这将列出存档中的每个文件夹和文件 import zipfile file zipfile ZipFile samples sample zip r for name in file namelist pr
  • 使用 Android 创建 ZIP 文件

    如何从 XML 文件创建 ZIP 文件 我想以 XML 格式备份所有收件箱消息 并压缩 XML 文件并将其存储在SD card http en wikipedia org wiki Secure Digital 下面的代码解决了我的问题 p
  • 在 Ruby 中处理 Zip 文件 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在ruby中仅在内存中创建zip文件 https stackoverflow com questions 11532502 how to create zip file only in memor
  • tar 和 zip 有什么区别? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 tar 和 zip 有什么区别 每个的用例是什么 tar其本身只是将文件捆绑在一起 结果称为tarball 尽管zip也应用压缩 通常你使用gzip随
  • 在 Powershell 4 中压缩和解压缩文件

    我使用的是 Windows Server 2012 R2 64 位 我有 powershell 版本 4 可用 我正在尝试压缩和解压缩文件 当我尝试 Write Zip 命令时 它会抛出以下错误 Write Zip 术语 Write Zip
  • 为什么 Python zipfile 不提供与命令行 zip 相同的输出 .zip 文件大小?

    这是生成的文件的大小zip seq 10000 gt 1 txt zip 1 1 txt adding 1 txt deflated 54 ls og 1 zip rw r r 1 22762 Aug 29 10 04 1 zip 这是一个
  • 如何使用 python(版本 2.5)压缩文件夹的内容?

    一旦我在特定文件夹中拥有了所需的所有文件 我希望我的 python 脚本能够压缩文件夹内容 这可能吗 我该如何去做呢 在 python 2 7 上你可以使用 Shutil make archive base name 格式 root dir
  • Node.js 中的 Zip 档案

    我想创建一个 zip 存档并将其解压缩到 node js 中 我找不到任何节点实现 node core 内置了 zip 功能 http nodejs org api zlib html http nodejs org api zlib ht
  • 在服务器上创建 Zip 文件并使用 java 下载该 zip

    我从 mkyong 获得了以下代码 用于在本地压缩文件 但是 我的要求是在服务器上压缩文件并需要下载它 任何人都可以帮忙吗 代码写入zip文件 public void zipFiles File contentFile File navFi
  • 我应该如何提取java中的压缩文件夹?

    我正在使用以下代码在 Java 中提取 zip 文件 import java io import java util zip class testZipFiles public static void main String args tr
  • 在 Clojure 中处理两个序列中的值对

    我正在尝试加入 Clojure 社区 我经常使用 Python 我广泛使用的功能之一是 zip 方法 用于迭代值对 在 Clojure 中是否有一种 聪明且简短的 方法可以实现相同的目标 另一种方法是简单地将 map 与一些按顺序收集其参数

随机推荐

  • 以管理员身份运行bat文件

    echo off gt nul 2 gt 1 SYSTEMROOT system32 cacls exe SYSTEMROOT system32 config system if errorlevel NEQ 0 goto UACPromp
  • 线性代数——矩阵1

    矩阵 Matrix 不要把矩阵放在分母上 矩阵的概念 有m n个数排成的m行n列的数表称为m行n列的矩阵 简称m n 记作 这m n个数称为矩阵A的元素 简称为元 数aij位于矩阵A的第i行第j列 称为矩阵A的 i j 元 以数 aij为
  • GIT常用统计

    查看git上个人代码量 git log author username pretty tformat numstat awk add 1 subs 2 loc 1 2 END printf added lines s removed lin
  • va_list 详解

    VA LIST 是在C语言中解决变参问题的一组宏 VA LIST的成员 1 va list型变量 ifdef M ALPHA typedef struct char a0 pointer to first homed integer arg
  • 【Spring 核心

    IoC IoC 简介 定义 IoC 和 DI Bean IoC 容器 Ioc IoC容器 IoC 简介 定义 IoC即控制反转 Inversion of Control 缩写为 IoC IoC又称为依赖倒置原则 设计模式六大原则之一 IoC
  • 技术文档工程师笔试_如何帮助工程师制作技术文档

    技术文档工程师笔试 As discussed in my previous post technical writers are a vital part of any team They focus on creating documen
  • FPGA计数器边界问题解析

    FPGA计数器边界问题解析 一次作者在处理AMBE2000数据接收过程中 遇到一个问题 对该计数器边界总是模糊不清 现在予以说明 以警示以后工作时书写错误代码 AMBE2000数据一旦准备好后 一次会输出24个字 其中第1个字0x13ec是
  • 数智人力时代,如何通过人才精细化管理发挥员工最大效能

    人才作为企业竞争中最活跃 也最有创造力的资源要素 管理他们同样也不得马虎 一刀切和单一维度地进行人才分类 不利于员工充分发挥主观能动性 进而提升组织能力 而要让员工在工作中有成就感 获得感和主动性 就需要进行人才精细化管理 对症下药 才能实
  • thinter打开新窗口隐藏主窗口并实现窗口切换

    from tkinter import windows Tk windows geometry 500x300 windows title 主窗口 def b windows withdraw 隐藏主窗口 global root root
  • 百度AI(一)

    前言 第一步 在百度AI上注册账号 在控制台内创建属于你的相应的应用 以下是创建完成后的 API Key SecretKey 是俩个要用到的参数 根据文档 选择相应的API 人脸对比请求地址 发送请求获取 access token 注意 a
  • keepalived + lvs (DR)

    目录 一 概念 二 实验流程命令 三 实验的目的 四 实验步骤 一 概念 Keepalived和LVS Linux Virtual Server 可以结合使用来实现双机热备和负载均衡 Keepalived负责监控主备服务器的可用性 并在主服
  • MySQL —— 复合查询

    目录 MySQL复合查询 一 基本查询回顾 二 多表查询 三 自连接 四 子查询 1 单行子查询 2 多行子查询 3 多列子查询 4 在from子句中使用子查询 五 合并查询 MySQL复合查询 一 基本查询回顾 前面我们讲解的mysql表
  • 2023年——个人每日分享汇总

    摘要 今年是每日分享的第四个年头 在这几年分享中 虽然回头看不知道当时分享内容由何而感 分享内容现在也遗忘记不住 但是这个过程中能够感觉到自己的一个改变 现在的内容错别字少了 也会检查一下语句是否通顺 修行 修心 成长 价值 学到一个四阶段
  • vue过滤器和修饰符

    过滤器的作用 在我们页面显示值之前加一层过滤 展示我们过滤后的值 注意事项 过滤器可以用在两个地方 双花括号插值和 v bind 表达式 使用语法 变量 过滤器名 1 全局定义 Vue filter gettime function dat
  • 百度墨卡托坐标转百度经纬度坐标Python

    本文参考 https blog csdn net qq 16664325 article details 67639684 原文用的是java语言 我只是把它转成Python语言 xu 6370996 81 Sp 1 289059486E7
  • shell脚本----if(数字条件,字符串条件,字符串为空)

    二元比较操作符 比较变量或者比较数字 注意数字与字符串的区别 1 整数比较 cpp view plain copy print eq 等于 如 if a eq b ne 不等于 如 if a ne b gt 大于 如 if a gt b g
  • plt.rcParams参数详解

    plt rcParams参数详解 0 plt rcParams参数 1 Font 1 1 字体 1 2 样式 新增 0 plt rcParams参数 plt rcParams keys font 1 Font 1 1 字体 plt rcPa
  • 数字化时代-20:一张图看清中国金融市场的轮廓

    关键词 资本 金钱 金融 银行 证券 保险 财政 中国制度优势 前言 本文试图通过图解的方式 从宏观上对中国的金融市场有一个初步的认识 在金融市场上流动的鲜血是金钱 金钱是金融市场 甚至整个经济的血液 金钱的充沛的流动给整个经济注入活力 金
  • 蓝桥杯 ADV-319 VIP试题 哈密尔顿回路(试题解析)

    试题 算法提高 哈密尔顿回路 提交此题 评测记录 资源限制 时间限制 2 0s 内存限制 256 0MB 问题描述 给出一个有向图 输出这个图的一个哈密尔顿回路 输入格式 输入的第一行包含两个整数n m 分别表示图的点数和边数 接下来m行
  • Java基础-实现zip解压缩

    可实现 文件 文件夹的解压缩操作 import java io File import java io FileInputStream import java io FileOutputStream import java io IOExc