zip压缩与解压

Java压缩与解压缩ZIP文件 小而美的使用JDK自带的ZIP工具包生成与解压缩ZIP文件 阅读详情
package fyhh.stream.io;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;

public class ZipUtil {
	
	//存放已压缩的文件目录
	private Map<String,ZipEntry> map = new HashMap<String,ZipEntry>();
	
	public static void main(String[] args) throws IOException {
		ZipUtil zu = new ZipUtil();
//		zu.unwrap(new File("h"), new File("tt.zip"));
		zu.wrap(new File("tt.zip"), new File("tt"));
	}
	
	/**
	 * 解压缩文件
	 * @param source		待解压文件
	 * @param destination	目标文件
	 * @return
	 * @throws IOException  if an I/O error has occurred
	 * @throws ZipException if a ZIP format error has occurred
	 */
	public boolean wrap(File source,File destination) throws ZipException, IOException {
		if(!source.exists()) {
			throw new FileNotFoundException("源文件不存在");
		}
		if(destination.exists()) {
			if(!destination.isDirectory()) {
				destination.mkdirs();
			}
		}else {
			destination.mkdirs();
		}
		ZipFile zipfile = new ZipFile(source);
		Enumeration<?> entries = zipfile.entries();
		while(entries.hasMoreElements()) {
			ZipEntry entry = (ZipEntry) entries.nextElement();
			File file = new File(destination.getPath()+File.separator+entry.getName());
			System.out.println(entry.getName());
			if(entry.isDirectory()) {
				file.mkdirs();
				continue;
			}
			InputStream is = zipfile.getInputStream(entry);
			BufferedInputStream bis = new BufferedInputStream(is);
			BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destination.getPath()+File.separator+entry.getName()));
			byte[] bytes = new byte[1024];
			int len = 0;
			while((len=bis.read(bytes))!=-1) {
				bos.write(bytes,0,len);
			}
			bis.close();
			bos.close();
		}
		zipfile.close();
		return false;
	}
	
	/**
	 * 压缩文件
	 * @param source	待压缩文件夹
	 * @param destination	压缩文件
	 * @return
	 * @throws IOException 
	 */
	public boolean unwrap(File source,File destination) throws IOException {
		//1.创建压缩文件
		if(!source.exists()) {
			throw new ZipException("待压缩文件不存在");
		}
		destination.delete();
		if(!destination.exists()) {
			destination.createNewFile();
		}
		//2.压缩文件
		ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(destination));
		if(source.isDirectory()) {
			addDirectory(source,zos,true);
		}else {
			addFile(source,zos);
		}
		zos.close();
		return true;
	}
	
	
	
	/**
	 * 压缩文件添加目录
	 * 
	 * @param file
	 * @param zos
	 * @throws IOException 
	 */
	private void addDirectory(File file, ZipOutputStream zos, boolean bool) throws IOException {
		String[] paths = file.getPath().split("\\/");
		StringBuilder builder = new StringBuilder();
		for(String path : paths) {
			if(path.trim().isEmpty()) {
				continue;
			}
			builder.append(path);
			String tpath = builder.toString();
			ZipEntry entry = new ZipEntry(tpath+"/");
			if(map.get(entry.getName()) == null) {
				map.put(entry.getName(), entry);
				zos.putNextEntry(entry);
				zos.closeEntry();
			}
			builder.append("/");
		}
		if(bool) {
			File[] files = file.listFiles();
			for(File f : files) {
				if(f.isDirectory()) {
					addDirectory(f, zos, true);
				}else {
					addFile(f, zos);
				}
			}
		}
		
	}
	
	/**
	 * 压缩文件添加文件
	 * 
	 * @param file
	 * @param zos
	 * @throws IOException 
	 */
	private void addFile(File file, ZipOutputStream zos) throws IOException {
		File parent = file.getParentFile();
		if(parent!=null) {
			if(map.get(new ZipEntry(parent.getPath()+"/").getName())!=null) {
				ZipEntry entry = new ZipEntry(file.getPath());
				if(map.get(entry.getName())==null) {
					zos.putNextEntry(entry);
					copyFile(file,zos);
					zos.closeEntry();
					map.put(entry.getName(), entry);
				}
			}else {
				addDirectory(parent, zos, false);
			}
		}
	}
	
	/**
	 * 复制文件
	 * 
	 * @param src
	 * @param dest
	 * @return
	 * @throws IOException 
	 */
	public void copyFile(File src,ZipOutputStream zos) throws IOException {
		//参数校验
		if(!src.exists()) {
			throw new FileNotFoundException("待复制文件未找到");
		}
		
		//完成复制
		BufferedInputStream bis = null;
		try {
			bis = new BufferedInputStream(new FileInputStream(src));
			byte[] bytes = new byte[1024];
			int len = 0;
			while((len=bis.read(bytes))!=-1) {
				zos.write(bytes, 0, len);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} finally {
			if(bis != null) {
				bis.close();
			}
		}
	}
	
}

上面的代码有部分没考虑到,导致代码较复杂,修改后的代码如下:

package fyhh.stream.io;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;

public class ZipUtil {
	
	public static void main(String[] args) throws IOException {
		ZipUtil zu = new ZipUtil();
		zu.unwrap(new File("h"), new File("tt.zip"));
//		zu.wrap(new File("tt.zip"), new File("tt"));
	}
	
	/**
	 * 解压缩文件
	 * @param source		待解压文件
	 * @param destination	目标文件
	 * @return
	 * @throws IOException  if an I/O error has occurred
	 * @throws ZipException if a ZIP format error has occurred
	 */
	public boolean wrap(File source,File destination) throws ZipException, IOException {
		if(!source.exists()) {
			throw new FileNotFoundException("源文件不存在");
		}
		if(destination.exists()) {
			if(!destination.isDirectory()) {
				destination.mkdirs();
			}
		}else {
			destination.mkdirs();
		}
		ZipFile zipfile = new ZipFile(source);
		Enumeration<?> entries = zipfile.entries();
		while(entries.hasMoreElements()) {
			ZipEntry entry = (ZipEntry) entries.nextElement();
			File file = new File(destination.getPath()+File.separator+entry.getName());
			System.out.println(entry.getName());
			if(entry.isDirectory()) {
				file.mkdirs();
				continue;
			}
			InputStream is = zipfile.getInputStream(entry);
			BufferedInputStream bis = new BufferedInputStream(is);
			BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destination.getPath()+File.separator+entry.getName()));
			byte[] bytes = new byte[1024];
			int len = 0;
			while((len=bis.read(bytes))!=-1) {
				bos.write(bytes,0,len);
			}
			bis.close();
			bos.close();
		}
		zipfile.close();
		return false;
	}
	
	/**
	 * 压缩文件
	 * @param source	待压缩文件夹
	 * @param destination	压缩文件
	 * @return
	 * @throws IOException 
	 */
	public boolean unwrap(File source,File destination) throws IOException {
		//1.创建压缩文件
		if(!source.exists()) {
			throw new ZipException("待压缩文件不存在");
		}
		destination.delete();
		if(!destination.exists()) {
			destination.createNewFile();
		}
		//2.压缩文件
		ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(destination));
		if(source.isDirectory()) {
			addDirectory(source,zos);
		}else {
			addFile(source,zos);
		}
		zos.close();
		return true;
	}
	
	
	
	/**
	 * 压缩文件添加目录
	 * 
	 * @param file
	 * @param zos
	 * @throws IOException 
	 */
	private void addDirectory(File file, ZipOutputStream zos) throws IOException {
		ZipEntry entry = new ZipEntry(file.getPath()+"/");
		zos.putNextEntry(entry);
		zos.closeEntry();
		
		File[] files = file.listFiles();
		for(File f : files) {
			if(f.isDirectory()) {
				addDirectory(f, zos);
			}else {
				addFile(f, zos);
			}
		}
	}
	
	/**
	 * 压缩文件添加文件
	 * 
	 * @param file
	 * @param zos
	 * @throws IOException 
	 */
	private void addFile(File file, ZipOutputStream zos) throws IOException {
		ZipEntry entry = new ZipEntry(file.getPath());
		zos.putNextEntry(entry);
		copyFile(file,zos);
		zos.closeEntry();
	}
	
	/**
	 * 复制文件
	 * 
	 * @param src
	 * @param dest
	 * @return
	 * @throws IOException 
	 */
	public void copyFile(File src,ZipOutputStream zos) throws IOException {
		//参数校验
		if(!src.exists()) {
			throw new FileNotFoundException("待复制文件未找到");
		}
		
		//完成复制
		BufferedInputStream bis = null;
		try {
			bis = new BufferedInputStream(new FileInputStream(src));
			byte[] bytes = new byte[1024];
			int len = 0;
			while((len=bis.read(bytes))!=-1) {
				zos.write(bytes, 0, len);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} finally {
			if(bis != null) {
				bis.close();
			}
		}
	}
	
}

可以这样改的原因就是lFile#istFiles方法,逐层遍历。

Linux:zip包的压缩与解压 压缩文件: zip命令语法:zip [-AcdDfFghjJKlLmoqrSTuvVwXyz$][-b ][-ll][-n ][-t ][-][压缩文件][文件...][-i ][-x ]补充说明:zip是个使用广泛的压缩程序,文件经它压缩后会另外产生具有".zip"扩展名的压缩文件。解压缩zip文件:unzip 命令详解 语法:unzip [-cflptuvz][-agCjLMnoqsVX][-P ][.zip文件][文件] 阅读详情

相关推荐

C++实现Zip压缩与解压缩技术详解

本文还有配套的精品资源,点击获取 简介:在IT行业中,zip压缩技术用于有效节省磁盘空间和提高数据传输效率。本文详细介绍了如何利用C++以及开源库zlib和minizip来实现zip文件的压缩与解压缩过程。从理解zip格式的基础原理,到掌握使用VC++进行压缩和解压缩的具体步骤,本文涵盖了从文件I/O到压缩算法的广泛应用,对于提升C++编程技能和构建高效可靠工具具有指导意义...

weixin_32925455的博客 2745

ZIP format

ZIP文件格式详解(一)——文件数据格式 ---------------------------------------------------------------------------------- 文档说明

lanmanyinhua的专栏 2935

VC++实现的ZIP压缩与解压技术

本文还有配套的精品资源,点击获取 简介:ZIP压缩与解压技术是数据存储和传输的关键部分。本文将详细讲解ZIP格式及其在VC++(Visual C++)环境下的压缩和解压缩实现,不依赖第三方库如zlib。文章将深入到ZIP文件的内部结构、数据压缩算法的原理,并提供关键的源代码文件如 unzip.cpp 和 zip.cpp ,以及相应的头文件 ...

weixin_28988985的博客 1473

ZIP(32位)文件格式详解

ZIP文件格式详解

分享各种技术 4650

基于ESP32-C3的便携式血氧仪硬件与算法实现

血氧饱和度(SpO₂)监测是生理参数无创检测的核心技术之一,其原理基于光电容积脉搏波(PPG)信号中红光与红外光吸收比值的动态变化。该技术依赖高精度模拟前端、稳定光学激励及实时数字信号处理能力,在消费级健康设备中面临功耗、体积与测量鲁棒性的多重约束。ESP32-C3凭借集成LEDC、12位ADC与低功耗双核架构,成为PPG终端的理想主控平台;结合定制化指夹式光学探头与比率法血氧算法,可实现非诊断级但趋势可靠的日常健康监测。本文围绕硬件电路设计、电源管理策略与嵌入式信号处理流程展开,覆盖从LED驱动、跨阻放大

weixin_29025501的博客 132

ConvLSTM时空预测实战代码详解

ConvLSTM代码复现

JaysonWong的博客 1万+

vs2019编译7zip format7z

vs2019编译7zip format7z第一种方式第二种方式 第一种方式 0x01. 进入7zsource\cpp目录 把Build.mak只读去掉 0x02. 把在第40行附近 LFLAGS = $(LFLAGS) -OPT:NOWIN98 后面的-OPT:NOWIN98去掉 0x03. 打开vs命令提示符工具 cd到7zsource\cpp\7zip目录 0x04. 执行 nmake NEW_COMPILER=1 MY_STATIC_LINK=1 0x05. 等待编译完成即可 第二种方式 0x01.

学习精进的路上 816

SCCM部署教程:(3)SCCM安装

这两则摘要介绍了WSUS和SCCM的安装步骤: WSUS安装:通过服务器管理器添加"Windows服务器更新服务"角色,选择SQL数据库并指定安装路径,验证数据库连接后完成安装。 SCCM安装:先运行预检工具Prereqchk.exe,选择主站点安装类型,配置语言、站点代码和名称,设置SQL数据库连接参数(保留默认端口4022),选择通信方法和系统角色(管理点和分发点),最后完成约1小时的安装过程。 两则安装指南都强调要确保数据库配置与前期准备一致,并提供了关键配置选项的说明。

小V锅的专栏 919

Zip (file format)

 Zip (file format) From Wikipedia, the free encyclopedia Jump to: navigation, search For other uses, see Zip. ZIP file format Filename extension .zip .zipx (newer compre

sharemyfree的专栏 3195

手把手教你如何修改YOLO11的模型结构(以CBAM和可变性卷积为例)

YOLO11修改模型结构

2401_86807530的博客 1万+

纽扣电池供电系统优化:NBM5100A与STM32F745VG组合方案

在低功耗物联网设备设计中,能量管理是核心挑战之一。纽扣电池因其体积小、成本低被广泛采用,但瞬时大电流需求常导致电压骤降和寿命缩短。通过超级电容缓冲技术,可以实现能量的细水长流式存储与集中释放。NBM5100A电源管理IC与STM32F745VG微控制器的组合方案,采用双阶段能量管理架构,先以恒定小电流充电,再通过电容释放大电流。这种方案不仅能提升系统稳定性,还能延长电池寿命3-5倍,特别适合智能门锁、无线传感器等需要间歇性高功率输出的场景。

weixin_29194255的博客 257

Zip文件格式

官方文档 https://pkware.cachefly.net/webdocs/APPNOTE/APPNOTE-6.2.0.txt 格式说明 在官方文档中给出的ZIP格式如下: Overall .ZIP file format: [local file header 1] [file data 1] [data descriptor 1] ...

877

Centos7.9上安装glibc2.28遇到/usr/bin/ld: cannot find -lnss_test2问题

Centos7.9安装glic2.28遇到-lnss_test2问题及解决方案。

freflying1119的博客 2898

Golang zip 压缩与解压

Go 和许多其他编程语言一样,标准库支持 zip 文件的压缩和解压。在本文中,我们将介绍如何在 Go 中利用标准库包完成 zip 文件的创建和提取。

Doublelv 的博客专栏。 1万+

自私兽群优化器(SHO)详解:从生物本能到智能优化

自私兽群优化器(SHO)是一种受动物群体自私行为启发的智能优化算法。该算法模拟动物在捕食威胁下的两种行为:聚集行为(全局搜索)和自私行为(局部搜索),将优化问题的解空间映射为生存环境,候选解视为猎物个体。SHO通过安全性评估将猎物分为安全、危险和高危三类,分别采用不同的位置更新策略,并引入捕食者角色增加选择压力。相比传统优化算法,SHO具有无需梯度信息、自适应平衡探索与开发、参数简单等优势,特别适合高维复杂和多模态优化问题。算法通过马尔可夫链理论保证收敛性,已在工程设计和数据挖掘等领域展现出良好性能。

qq_42212808的博客 199

UG\NX二次开发 找不到指定的dlx文件(Specified Dlx file not found)

有群友问:用Ctrl+U运行的时候就报错,找不到指定的dlx文件Specified Dlx file not found。怎么处理。

王牌飞行员_里海的博客 1131

Java实现Zip压缩包解压

对zip压缩包的解压是比较常见的应用场景,java代码的实现也很简单。废话不多说,直接上代码吧 一、代码 /** * zip解压 * @param srcFile zip源文件 * @param destDirPath 解压后的目标文件夹 * @throws RuntimeException 解压失败会抛出运行时异常 */ publi...

denghonghao的博客 4万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

zip命令解压缩

zip 解压缩命令详解

走在bug的路上 2万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Android zip文件压缩与解压

Android zip文件压缩与解压 Android开发中偶尔需要用到zip文件的压缩与解压,正好公司项目需要用到,趁此机会特意总结了下,分享给大家,也是对我学习Android的记录。 zip压缩 Android中的zip压缩主要用到两个类:ZipEntry,ZipOutputStream,ZipEntry类用于保存一些被压缩文件的信息,如文件名、修改时间等等,部分源码如下: class ZipE...

shuaizhigen的博客 1万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

JAVA实现实用的ZIP压缩与解压

程序实现了ZIP压缩。共分为2部分 : 压缩(compression)与解压(decompression) 大致功能包括用了多态,递归等JAVA核心技术,可以对单个文件和任意级联文件夹进行压缩和解压。 需在代码中自定义源输入路径和目标输出路径。  package com.han; import java.io.*; import java.util.zip.*; /** * 程序实现了

Gaowen_HAN的专栏 12万+

java zip压缩解压_JAVA实现实用的ZIP压缩与解压

程序实现了ZIP压缩。共分为2部分 : 压缩(compression)与解压(decompression)大致功能包括用了多态,递归等JAVA核心技术,可以对单个文件和任意级联文件夹进行压缩和解压。 需在代码中自定义源输入路径和目标输出路径。package com.han;import java.io.*;import java.util.zip.*;/*** 程序实现了ZIP压缩。共分为2部分 ...

weixin_34321609的博客 2636

Golang zip文件解压与压缩

新一周的工作内容,基本就是研究这个zip文件的解压与压缩了。如上一篇一样,官方文档解释的并不是很清楚。google百度出来的结果都是有问题的,要不就是文件压缩之后,压缩内容变0kb 要不就是文件写入之后解压出来不知道是个什么鬼了。我只用了这一种方式,其他的gzip和tar等有时间在研究。不过我想也都大同小异了。先上代码,然后再说说我在研究的时候遇到的问题吧。 文件压缩 /** @file...

Leor 1万+

ZIP文件压缩与解压缩

ZIP4J解压优点 ZIP4J 是一个支持处理ZIP文件的开源库 支持创建,修改,添加,删除,解压 压缩文件 支持读/写密码保护 支持AES加密 128/256 支持标准ZIP加密 支持进度监视器 自持Unicode 文件名 支持创建分卷压缩文件 支持将文件添加到压缩包中但不进行压缩 ZIP4J 项目地址为 :http://www.lingala.net/zip4j/ 项目包结构分为三层:...

weixin_42475998的博客 843

python_压缩与解压zip

1.zip (1)压缩 import os import zipfile import sys import time #class zipfile.ZipFile(file[, mode[, compression[, allowZip64]]]) #创建一个ZipFile对象,表示一个zip文件。参数file表示文件的路径或类文件对象(file-like object);参数mode指示

i_shidan的博客 6382

java解压缩/压缩/加密压缩/加密解压缩 ZIP4J ZIP文件压缩与解压缩学习

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最近公司准备让各项目组

yrryyff的博客 1629

ZIP4J压缩与解压缩

ZIP4j 压缩与解压的实例详解 使用的jar包:zip4j_2.6.4jar 1.导入maven依赖 <dependency> <groupId>net.lingala.zip4j</groupId> <artifactId>zip4j</artifactId> <version>1.3.2</version>

liang博客 3274
上一篇: jdk安装及配置
hzq_ah
博客等级 码龄10年 4粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值