利用Java zip进行对文件的压缩和解压

利用Java JDK自带 进行对文件的压缩和解压

实现一个文件的zip压缩,过程可以简单地表示为:
在这里插入图片描述

ZipEntry:表示 ZIP 文件条目

构造方法:

  • public ZipEntry(String name) 可以用文件的相对路径来构造ZipEntry对象

ZipOutputStream: ZIP 文件格式写入文件实现输出流过滤器用于文件的解压

  • public void write(byte[] b,int off,int len) throws IOException
    将字节数组写入当前 ZIP 条目数据。在写入所有字节之前,此方法将阻塞。

  • public void setLevel(int level)
    为后续的 DEFLATED 条目设置压缩级别。默认设置是 DEFAULT_COMPRESSION。

  • public void close() throws IOException
    关闭 ZIP 输出流和正在过滤的流。

  • public void putNextEntry(ZipEntry e) throws IOException
    开始写入新的 ZIP 文件条目并将流定位到条目数据的开始处。如果仍处于活动状态,则关闭当前条目。如果没有为条目指定压缩方法,则使用默认的压缩方法;如果没有为条目设置修改时间,则使用当前时间。

  • public void closeEntry()throws IOException
    关闭当前 ZIP 条目并定位流以写入下一个条目。

ZipInputStream :读取 ZIP 文件格式的文件实现输入流过滤器(解压文件)

  • public ZipEntry getNextEntry()throws IOException
    读取下一个 ZIP 文件条目并将流定位到该条目数据的开始处。

  • public int read(byte[] b,int off,int len)throws IOException
    从当前 ZIP 条目读入字节数组。如果 len 不为零,则在某些输入可用之前,此方法将处于阻塞状态;否则,不读取字节并且返回 0

获取目录的所有子目录和文件

 /*** 得到源文件路径的所有文件* @param dirFile 压缩源文件路径* */public static List<File> getAllFile(File dirFile){List<File> fileList=new ArrayList<>();File[] files= dirFile.listFiles();for(File file:files){//文件if(file.isFile()){fileList.add(file);System.out.println("add file:"+file.getName());}else {//目录if(file.listFiles().length!=0){//非空目录fileList.addAll(getAllFile(file));//把递归文件加到fileList中}else {//空目录fileList.add(file);System.out.println("add empty dir:"+file.getName());}}}return fileList;}

获取文件的相对路径:

/*** 获取相对路径* @param dirPath 源文件路径* @param file 准备压缩的单个文件* */public static String getRelativePath(String dirPath,File file){File dirFile=new File(dirPath);String relativePath=file.getName();while (true){file=file.getParentFile();if(file==null) break;if(file.equals(dirFile)){break;}else {relativePath=file.getName()+"/"+relativePath;}}return relativePath;}

完整项目的代码:

/*** java.util.zip压缩/解压文件* */
public class ZipUtil {/** 缓冲器大小 */private static final int BUFFER = 512;/**压缩得到的文件的后缀名*/private static final String SUFFIX=".zip";/*** 得到源文件路径的所有文件* @param dirFile 压缩源文件路径* */public static List<File>  getAllFile(File dirFile){List<File> fileList=new ArrayList<>();File[] files= dirFile.listFiles();for(File file:files){//文件if(file.isFile()){fileList.add(file);System.out.println("add file:"+file.getName());}else {//目录if(file.listFiles().length!=0){//非空目录fileList.addAll(getAllFile(file));//把递归文件加到fileList中}else {//空目录fileList.add(file);System.out.println("add empty dir:"+file.getName());}}}return fileList;}/*** 获取相对路径* @param dirPath 源文件路径* @param file 准备压缩的单个文件* */public static String getRelativePath(String dirPath,File file){File dirFile=new File(dirPath);String relativePath=file.getName();while (true){file=file.getParentFile();if(file==null) break;if(file.equals(dirFile)){break;}else {relativePath=file.getName()+"/"+relativePath;}}return relativePath;}/***@param destPath 解压目标路径*@param fileName 解压文件的相对路径* */public static File createFile(String destPath, String fileName){String[] dirs = fileName.split("/");//将文件名的各级目录分解File file = new File(destPath);if (dirs.length > 1) {//文件有上级目录for (int i = 0; i < dirs.length - 1; i++) {file = new File(file, dirs[i]);//依次创建文件对象知道文件的上一级目录}if (!file.exists()) {file.mkdirs();//文件对应目录若不存在,则创建try {System.out.println("mkdirs: " + file.getCanonicalPath());} catch (IOException e) {e.printStackTrace();}}file = new File(file, dirs[dirs.length - 1]);//创建文件return file;} else {if (!file.exists()) {//若目标路径的目录不存在,则创建file.mkdirs();try {System.out.println("mkdirs: " + file.getCanonicalPath());} catch (IOException e) {e.printStackTrace();}}file = new File(file, dirs[0]);//创建文件return file;}}/*** 没有指定压缩目标路径进行压缩,用默认的路径进行压缩* @param dirPath 压缩源文件路径* */public static void compress(String dirPath){int firstIndex= dirPath.indexOf("/");int lastIndex= dirPath.lastIndexOf("/");String zipFileName=dirPath.substring(0,firstIndex+1)+dirPath.substring(lastIndex+1);compress(dirPath,zipFileName);}/*** 压缩文件* @param dirPath 压缩源文件路径* @param zipFileName 压缩目标文件路径* */public static void compress(String dirPath,String zipFileName){zipFileName=zipFileName+SUFFIX;//添加文件的后缀名File dirFile=new File(dirPath);List<File> fileList= getAllFile(dirFile);byte[] buffer=new byte[BUFFER];ZipEntry zipEntry=null;int readLength=0;     //每次读取出来的长度try {// 对输出文件做CRC32校验CheckedOutputStream cos = new CheckedOutputStream(new FileOutputStream(zipFileName), new CRC32());ZipOutputStream zos = new ZipOutputStream(cos);for(File file:fileList){if(file.isFile()){   //若是文件,则压缩文件zipEntry=new ZipEntry(getRelativePath(dirPath,file));  //zipEntry.setSize(file.length());zipEntry.setTime(file.lastModified());zos.putNextEntry(zipEntry);InputStream is=new BufferedInputStream(new FileInputStream(file));while ((readLength=is.read(buffer,0,BUFFER))!=-1){zos.write(buffer,0,readLength);}is.close();System.out.println("file compress:"+file.getCanonicalPath());}else {     //若是空目录,则写入zip条目中zipEntry=new ZipEntry(getRelativePath(dirPath,file));zos.putNextEntry(zipEntry);System.out.println("dir compress: " + file.getCanonicalPath()+"/");}}zos.close();  //最后得关闭流,不然压缩最后一个文件会出错} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}/*** 解压* */public static void decompress(String zipFileName,String destPath){try {zipFileName=zipFileName+SUFFIX;ZipInputStream zis=new ZipInputStream(new FileInputStream(zipFileName));ZipEntry       zipEntry       = null;byte[]         buffer         = new byte[BUFFER];//缓冲器int            readLength     = 0;//每次读出来的长度while ((zipEntry=zis.getNextEntry())!=null){if(zipEntry.isDirectory()){//若是目录File file=new File(destPath+"/"+zipEntry.getName());if(!file.exists()){file.mkdirs();System.out.println("mkdirs:"+file.getCanonicalPath());continue;}}//若是文件File file = createFile(destPath,zipEntry.getName());System.out.println("file created: " + file.getCanonicalPath());OutputStream os=new FileOutputStream(file);while ((readLength=zis.read(buffer,0,BUFFER))!=-1){os.write(buffer,0,readLength);}os.close();System.out.println("file uncompressed: " + file.getCanonicalPath());}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/555031.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql数据库设计教材_mySQL教程 第1章 数据库设计

E-R设计很多同学在学SQL语句时&#xff0c;觉得非常困难&#xff0c;那是因为你在学一个你根本不了解的数据库&#xff0c;数据库中的表不是你设计的&#xff0c;表与表之间的关系你不明白。因此在学SQL语句之前&#xff0c;先介绍一下数据库设计。下面举例说明数据库设计&…

谷歌浏览器Network详解

Network用F12打开后&#xff0c;出现以下页面。5个部分分别讲解。 控制器过滤器时间轴资源内容资源概况 1.控制器 Preserve log:页面刷新也不会清空请求 Disable cache:停用浏览器缓存 Online:有网 Fast 3G、Slow 3G:自定义网速 Offline:离线模拟 2.过滤器 2.1按字符串过…

mysql5.7.14安装版_MySql5.7.14安装教程详解(解压版)_MySQL

下面进入正式的教程&#xff1a;第一步&#xff1a;下载最近的MySQL文件并且解压&#xff1a;下载最新版的MySQL–mysql-5.7.12下载地址将下载到的文件解压缩到自己喜欢的位置&#xff0c;例如我自己的位置是D:\MySQL\mysql-5.7.12-winx64第二步&#xff1a;配置环境变量这里不…

Java main方法_解释Java中的main方法,及其作用_一个java文件中可包含多个main方法

public static void main(String[] args) {}或者 public static void main(String args[]) {}main方法是我们学习Java语言学习的第一个方法&#xff0c;也是每个java使用者最熟悉的方法,每个Java应用程序都必须有且仅有一个main方法。在eclipse里可以使用输入main&#xff0c;…

端口号被占用:Disconnected from the target VM, address: ‘127.0.0.1:XXXX‘, transport: ‘socket‘

debug启动Spring boot项目的时候&#xff0c;项目没有启动起来。log最后一行&#xff0c;显示Disconnected from the target VM, address: ‘127.0.0.1:XXXX’, transport: ‘socket’。 解决方式&#xff01;&#xff01;&#xff01; 1、看看是谁占用了我的端口号&#xff…

Linux系统tab自动补全快捷键的时候显示cannot create temp file for here-document: No space left on device解决方案

登陆linux系统之后&#xff0c;使用tab自动补全快捷键的时候显示&#xff1a;cannot create temp file for here-document: No space left on device。 原因&#xff1a;磁盘满了&#xff0c;不能创建临时文件。 解决方法&#xff1a;&#xff08;逐级查看占用空间过多的目录…

python画二维数组散点图_2个numpy二维数组的散点图

IIUC,你不需要zip步骤:s (arr1.ravel(), arr2.ravel())plt.scatter(*s)plt.show()或者,你也可以通过策划arr1和arr2:plt.scatter(arr1, arr2)plt.show()原因是,通过压缩,可以创建许多坐标元组:>>> list(zip(*s))[(0.5233576831070681, 0.3622905772322086), (0.67714…

双表联查mysql_MySQL的双表多表联查

最近在做EC-Mall的二次开发&#xff0c;遇到这么一个需求&#xff0c;将挂件单独显示成一个页面。由于EC-Mall的挂件是用数据模块模块类库的方式进行的&#xff0c;就是使用类似smarty的形式。而单独一个页面的话&#xff0c;数据读取需要自己写SQL语句。 现在的问题是&#xf…

Linux中的通配符

Linux中的通配符 Linux中的通配符 *匹配任意长度的任意字符&#xff0c;可以没有?匹配任意单个字符&#xff0c;至少有1个[ ]匹配指定字符范围内的任意单个字符[a-z,A-Z,0-9]匹配所有数字和字母[a-z]匹配a-z中的一个[A-Z]匹配A-Z中的一个[a-Z]匹配所有大小写字母[:upper:]所…

mysql区间段_解决针对MySQL中对于某一个区间段范围的数据更新的情况

(1)在使用更新update的过程中&#xff0c;我们可能会想要更新比如id段在某一个指定范围内的数据&#xff0c;如果我们是想要更新前面多少行的数据的话可以直接&#xff1a;UPDATE tb_name SET column_name‘value‘ ORDER BY id ASC LIMIT 20;比如我想要把下面的这个员工信息表…

SpringBoot实现执行sql语句打印到控制台

SpringBoot实现执行sql语句打印到控制台 1.简介 每当写完持久化语句时肯定免不了要查漏补缺一波。这里就可以将执行的sql打印到控制台来检查sql语句哪里出了问题。 2.配置 配置非常简单&#xff0c;只需要在配置文件中设置下mapper日志级别就可以了 application-test.prop…

BigDecimal中divide(除)方法注意问题_BigDecimal 判断大于小于

BigDecimal中divide方法抛异常: Non-terminating decimal expansion; no exact representable decimal resultIdea也会给出警告 原因是在做除法的时候出现了无限不循环小数如&#xff1a;33.333333333333 解决方案 在做除法的时候指定保留的小数的位数: BigDecimal rate …

python 字符串操作速度_强者一出,谁与争锋?与Python相比,C+的运行速度究竟有多快?|python|编程语言|字符串|示例|算法...

对于数据科学家而言&#xff0c;热爱Python的理由数不胜数。但你是否也曾问过这样的问题&#xff1a;Python和C或C等更专业的低级编程语言究竟有何不同呢?我想这是很多数据科学家或者Python用户曾经问过或者将来会问自己的问题。Python和C类语言之间存在许多区别&#xff0c;本…

Maven私有仓库、上传jar包、引用私服jar包、上传本地项目到私服_将已有jar包部署到私服

Maven私有仓库、上传jar包、引用私服jar包、上传本地项目到私服 搭建私有服务器 前面已经说过了&#xff0c;我们使用Maven的使用&#xff0c;如果需要导入相对应的jar包&#xff0c;Maven首先会在我们的本地仓库中寻找—>私有仓库—>中心仓库… 然而&#xff0c;我们…

java水泡_JAVA图像处理系列(八)——艺术效果:水泡

艺术效果水泡通过对图像进行变形或叠加其他图片&#xff0c;能够实现许多有趣的艺术效果&#xff0c;本文介绍类似水泡效果的实现方式&#xff0c;下面先看一下实现的效果。第一张为原始图像&#xff0c;第二张为叠加水泡效果的图像。cat.jpgcat_belb.jpg算法原理图像中的水泡效…

java读word_java读word文件(示例代码)

Apache POI是Apache软件基金会的开放源码函式库&#xff0c;POI提供API给Java程序对Microsoft Office格式档案读和写的功能。1.读取word 2003及word 2007需要的jar包读取 2003 版本(.doc)的word文件相对来说比较简单&#xff0c;只需要 poi-3.5-beta6-20090622.jar 和 poi-scra…

Dubbo调用远程服务详解_导入jar方式

Dubbo调用远程服务 1.创建公共接口模块api 公共接口主要用于存放接口对象,这里我们只创建一个服务层的接口IndexService用于远程调用服务的测试 package com.example.dubboapi.service;public interface IndexService {String echo(); }

Dubbo SpringBoot+Dubbo泛化的使用,以及开发时直连本地的Dubbo服务(Dubbo指定点对点调用服务)

​ 一般情况我们使用dubbo)通过rpc调用dubbo提供方的服务&#xff0c;首先要在消费者的项目中引入接口提供者的jar包&#xff08;provider端暴露的接口和方法&#xff09;&#xff0c;然后使用jar包里面的类和方法&#xff0c;两端才能正常通信调用。但是如果要调N个不同服务提…

java string... 参数_Java String.Format() 方法及参数说明

JDK1.5中&#xff0c;String类新增了一个很有用的静态方法String.format():format(Locale l, String format, Object... args) 使用指定的语言环境、格式字符串和参数返回一个格式化字符串。format(String format, Object... args) 使用指定的格式字符串和参数返回一个格式化字…

Unity3D VS UE4

Unity3D&#xff08;U3D&#xff09; 1.视觉效果&#xff1a;Unity3D相对UE4略逊、手机3D应用、3D游戏轻量级首选&#xff0c;支持跨平台、设备兼容性更好 2.产品力&#xff1a;Unity3D更加多元化&#xff0c;各平台都有代表作&#xff0c;比如《王者荣耀》《炉石传说》《纪念…