利用JUZ包实现文件压缩和解压
压缩解压过程还是用IO流对文件的读写操作
本质还是对API的引用,代码逻辑比较简单,相关注释比较详细,请在代码中查看
代码已跑通,可自行copy测试
注:1. 在压缩文件时,传入的压缩文件路径必须是以.zip结尾的文件,否则会压缩失败
2. 解压时,在创建文件的时候注意不要将文件名也作为文件夹创建,否则会报错,原因及正确代码已贴在文章末尾
工具类
package com.lx.ZipUtils;import java.io.*;
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;public class ZipUtils {//压缩文件public static void createZip(String baseDir , String zipName) throws Exception {File baseFile = new File(baseDir);if (baseFile.exists()){List<File> baseFileList = getSubFiles(baseFile);//压缩文件名及全路径zipName,以.zip结尾,创建输出流,后续文件写入该zip文件ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(zipName));ZipEntry zipEntry = null;byte[] buf = new byte[1024];int readLen = 0;String a = "";//遍历所有文件并读取,写到zipOutputStream中for (File file : baseFileList) {//创建ZipEntry//System.out.println(getFileName(baseDir,file)+" "+baseDir+" "+file);zipEntry = new ZipEntry(getAbsFileName(baseDir,file));//创建ZipEntry对象,参数为各文件在源文件的相对路径(在压缩文件中保留)//zipEntry = new ZipEntry(file.getName());//直接压缩,不保留原相对路径zipEntry.setSize(file.length());//设置文件大小zipEntry.setTime(file.lastModified());//读取文件的最后修改时间,作为压缩文件中文件的修改时间//将ZipEntry放到ZipOutputStream中(ZipEntry相当于在压缩文件中创建对应文件的空间,后续将读取的内容写到该位置)zipOutputStream.putNextEntry(zipEntry);/*BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file),"utf-8"));//纯文本文件外会乱码while((a = reader.readLine())!=null){zipOutputStream.write(a.getBytes());}reader.close();*/BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(file));while((readLen = inputStream.read(buf,0,1024))!=-1){zipOutputStream.write(buf,0,readLen);}inputStream.close();}zipOutputStream.close();}else {throw new Exception("文件夹不存在");}}//解压文件public static void releaseZip(String sourceZip , String outFileName) throws IOException {ZipFile zipFile = new ZipFile(sourceZip);Enumeration<? extends ZipEntry> zipList = zipFile.entries();ZipEntry zipEntry = null;int readLen = 0;byte[] buf = new byte[1024];while(zipList.hasMoreElements()){zipEntry = zipList.nextElement();if (zipEntry.isDirectory()){continue;}BufferedInputStream bis = new BufferedInputStream(zipFile.getInputStream(zipEntry));System.out.println(zipEntry.getName());System.out.println(getRealFile(outFileName, zipEntry.getName()));BufferedOutputStream bos =new BufferedOutputStream(new FileOutputStream(getRealFile(outFileName, zipEntry.getName())));while ((readLen = bis.read(buf,0,1024))!=-1){bos.write(buf,0,readLen);}bos.close();bis.close();}}//遍历给定文件夹中的所有文件public static List<File> getSubFiles(File baseFile){List<File> baseFileList = new ArrayList<>();File[] files = baseFile.listFiles();for (int i = 0; i < files.length; i++) {//是目录,加入baseFileListif (files[i].isFile()){baseFileList.add(files[i]);}//是文件,递归if (files[i].isDirectory()){baseFileList.addAll(getSubFiles(files[i]));}}return baseFileList;}//给定根目录及文件全路径,返回相对路径作为压缩文件中的路径public static String getAbsFileName(String baseDir, File realFile){File file = realFile;File baseFile = new File(baseDir);String fileName = file.getName();while(true){file = file.getParentFile();if (file == null){break;}if (file.equals(baseFile)){break;}else {fileName = file.getName()+"/"+fileName;}}return fileName;}//根据压缩文件中的路径生成文件夹public static File getRealFile(String outFileName , String absFileName){String[] split = absFileName.split("/");File realFile = new File(outFileName);//创建目录if (split.length > 1){for (int i = 0 ; i < split.length-1 ; i++){//最后一位为文件,不参与文佳夹创建realFile = new File(realFile, split[i]);}}if (!realFile.exists()){realFile.mkdirs();}return new File(realFile,split[split.length-1]);//在文件夹下创建文件}
}
测试类
package com.lx.ZipUtils;public class TestZip {public static void main(String[] args) throws Exception {ZipUtils.createZip("C:\\Users\\Desktop\\面试","C:\\Users\\Desktop\\0603.zip");ZipUtils.releaseZip("C:\\Users\\Desktop\\0603.zip","D:\\解压");}
}
测试过程中出现下面报错
原因是:在解压时,直接将文件名也作为路径创建,导致写出文件时找不到对应文件
找不到文件会报 拒绝访问
找不到文件夹回报 找不到对应路径
正确代码
错误代码
利用JUZ包实现文件压缩和解压相关推荐
- Linux的zip压缩文件压缩和解压
Linux的zip压缩文件压缩和解压 <Linux一线运维实战>清华大学出版社(即将出版) 通常,系统中的文件的可以被直接打开的,这就难免文件的内容被查看.另外,对于要归档保存的(压缩)文 ...
- python调用程序压缩文件_Python实现文件压缩和解压的示例代码
大家可能都熟悉.zip格式的文件.它可以把多个文件,压缩成一个文件.这在网络上传输时很有用,而且节省硬盘空间. 接下来,我们使用Python实现压缩和解压. 读取ZIP文件信息 要读取ZIP文件的内容 ...
- android文件压缩库,Android文件压缩和解压
Android文件压缩和解压 Java代码 package com.maidong.utils; import java.io.BufferedInputStream; import java.io. ...
- python解压文件_使用Python实现文件压缩和解压
大家可能都熟悉.zip格式的文件.它可以把多个文件,压缩成一个文件.这在网络上传输时很有用,而且节省硬盘空间. 接下来,我们使用Python实现压缩和解压. 读取ZIP文件信息 要读取ZIP文件的内容 ...
- c++创建文件_使用Python实现文件压缩和解压
(点击上方快速关注并设置为星标,一起学Python) 来源:网络 大家可能都熟悉.zip格式的文件.它可以把多个文件,压缩成一个文件.这在网络上传输时很有用,而且节省硬盘空间. 接下来,我们使用Pyt ...
- java压缩和解压流,实现文件压缩和解压,代码都有注释
压缩和解压流 压缩文件: ZipOutputStream 常用方法 方法名 介绍 ZipOutputStream(OutputStream out) 构造方法:创建新的ZIP输出流 public vo ...
- C#利用自带的ZipFile压缩和解压zip文件,超级简单
ZipFile类是.NET Framework 4.5发布的一个C#压缩文件和解压zip文件的一个类库,它支持.NET Framework 4.5以上版本,包括.NET Core1.0和.NET5以上 ...
- Linux文件压缩和解压命令【gzip、gunzip、zip、unzip、tar】【详细总结】
解压和压缩 gzip/gunzip gzip 压缩文件 gunzip 解压缩文件 zip/unzip zip 命令语法 命令选项 实例 unzip 语法: 命令选项 实例 tar 语法 实例 例一:将 ...
- Zip文件压缩和解压功能
1.算法基本功:递归遍历文件夹 2.学会使用Java提供的ZipFile,ZipInputStream,ZipOutputStream,CharSet(抽象类) 3.具体实现: 解压方法1: 1.利用 ...
最新文章
- 编译器设计-RunTime运行时环境
- kafka log4j配置
- Oracle数据库之对象视图、索引、序列、同义词
- 静态资源部署到服务器不能访问
- interrupt、interrupted 、isInterrupted 区别
- TX2Ubuntu16.04上安装 kinectV2
- 设计模式之创建型(1)-简单工厂
- 如何搞定 K8S 微服务自动化发布系统
- 100个思维模型(不一定都适用,各取所需)
- Excel VBA 入门基础
- 输入一个整数,判断它是几位数
- 2023秋招360公司NLP算法岗面经
- 重视苹果和谷歌的警告信
- 你眼中的罗振宇和罗辑思维?
- 【java毕业设计】基于javaEE+SSH+mysql的百货中心供应链管理系统设计与实现(毕业论文+程序源码)——供应链管理系统
- 什么是SOA,谈谈自己的看法(转)
- mblock机器人指令_mBot机器人如何通过蓝牙实现与PC端mBlock的无线通信?
- 火炮火控系统嵌入式软件测试平台研究
- iOS 名片识别代码
- 怎么让用户用好你的在线帮助文档协作工具?