根据文件目录实现文件的压缩与解压

import java.io.BufferedInputStream;
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.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;public class ZipFile {public static void main(String[] args) {//压缩测试
//      int count = doZip("D:\\Personality\\pdf\\zipTest", "myZip.zip");//解压测试int count = unzip("D:\\Personality\\pdf\\zipTest", "myZip.zip");System.out.println(count);}/** 缓冲器大小 */private static final int BUFFER = 1024;/*** decompression* @param srcPath  待解压文件路径* @param zipFileName    带解压文件名称* @return   解压文件个数*/public static int unzip( String srcPath,String zipFileName) {ZipInputStream zipInputStream = null;//ZIP文件入口ZipEntry zipEntry = null;//缓冲区byte[] buffer = new byte[BUFFER];// 本次读出来的长度int readLength = 0;//解压文件个数int count = 0;try {zipInputStream = new ZipInputStream(new FileInputStream(srcPath+"//"+zipFileName));while ((zipEntry = zipInputStream.getNextEntry()) != null) {// 若是ZIP条目目录,则需创建这个目录if (zipEntry.isDirectory()) {File dir = new File(srcPath + "/" + zipEntry.getName());if (!dir.exists()) {dir.mkdirs();continue;}}// 若是文件,则需创建该文件File file = createFile(srcPath, zipEntry.getName());count++;OutputStream outputStream = new FileOutputStream(file);while ((readLength = zipInputStream.read(buffer, 0, BUFFER)) != -1) {outputStream.write(buffer, 0, readLength);}outputStream.close();}} catch (FileNotFoundException e) {e.printStackTrace();return -1;} catch (IOException e) {e.printStackTrace();return -2;} finally {//关闭流try {if (zipInputStream != null)zipInputStream.close();} catch (IOException e) {e.printStackTrace();return -2;}}return count;}/*** compression* @param srcPath     待压缩文件目录* @param zipFileName 压缩后文件名称* @return 压缩文件个数*/public static int doZip(String srcPath, String zipFileName) {File srcFile = new File(srcPath);//通过路径获取文件集合List <File> fileList = getAllFiles(srcFile);//缓冲区byte[] buffer = new byte[BUFFER];//ZIP文件入口ZipEntry zipEntry = null;//本次读取长度int readLength = 0;ZipOutputStream zipOutputStream = null;//压缩后文件的名称String newZipFileName;//压缩文件总个数int count = 0;if(zipFileName==null||zipFileName.length()==0) {newZipFileName= srcPath+"newZip.zip";}else {newZipFileName = srcPath+"\\"+zipFileName;}try {          zipOutputStream = new ZipOutputStream(new FileOutputStream(newZipFileName));for (File file : fileList) {// 若是文件,则压缩这个文件if (file.isFile()) {count++;zipEntry = new ZipEntry(getRelativePath(srcPath, file));zipEntry.setSize(file.length());zipEntry.setTime(file.lastModified());zipOutputStream.putNextEntry(zipEntry);InputStream inputStream = new BufferedInputStream(new FileInputStream(file));while ((readLength = inputStream.read(buffer, 0, BUFFER)) != -1) {zipOutputStream.write(buffer, 0, readLength);}inputStream.close();} else {zipEntry = new ZipEntry(getRelativePath(srcPath, file) + "/");zipOutputStream.putNextEntry(zipEntry);}}} catch (FileNotFoundException e) {e.printStackTrace();return -1;} catch (IOException e) {e.printStackTrace();return -2;} finally {try {if (zipOutputStream != null)zipOutputStream.close();} catch (IOException e) {e.printStackTrace();return -2;}}return count;}/*** get file list from srcFile* @param srcFile  文件路径* @return  对文件路径下的所有文件集合*/private static List<File> getAllFiles(File srcFile) {List<File> fileList = new ArrayList<File>();File[] tmp = srcFile.listFiles();for (int i = 0; i < tmp.length; i++) {if (tmp[i].isFile()) {fileList.add(tmp[i]);}if (tmp[i].isDirectory()) {// 若不是空目录,则递归添加其下的目录和文件if (tmp[i].listFiles().length != 0) {fileList.addAll(getAllFiles(tmp[i]));}// 若是空目录,则添加这个目录到fileListelse {fileList.add(tmp[i]);}}}return fileList;}private static String getRelativePath(String dirPath, File file) {File dir = new File(dirPath);String relativePath = file.getName();while (true) {file = file.getParentFile();if (file == null) {break;}if (file.equals(dir)) {break;} else {relativePath = file.getName() + "/" + relativePath;}}return relativePath;}private static File createFile(String srcPath, String fileName){// 将文件名的各级目录分解String[] dirs = fileName.split("/");File file = new File(srcPath);// 文件有上级目录if (dirs.length > 1) {for (int i = 0; i < dirs.length - 1; i++) {// 依次创建文件对象知道文件的上一级目录file = new File(file, dirs[i]);}if (!file.exists()) {// 文件对应目录若不存在,则创建file.mkdirs();}// 创建文件file = new File(file, dirs[dirs.length - 1]);return file;} else {if (!file.exists()) {// 若目标路径的目录不存在,则创建file.mkdirs();}// 创建文件file = new File(file, dirs[0]);return file;}}
}

使用java.util.zip包实现根据文件目录控制文件的压缩与解压相关推荐

  1. java.util.zip_[Java 基础] 使用java.util.zip包压缩和解压缩文件

    Java API中的import java.util.zip.*;包下包含了Java对于压缩文件的所有相关操作. 我们可以使用该包中的方法,结合IO中的相关知识,进行文件的压缩和解压缩相关操作. Zi ...

  2. java.util.zip包 OutputStream ZipOutputStream以压缩包的方式导出或下载多个文件,比如图片,文档,Excel表格等

    目录 前言 逻辑流程 代码 请求接口 压缩文件方法 关闭文件流 前言 接到个需求,从数据库查询出多个用户,每个用户都会有头像,以压缩包的方式下载这些用户的头像,这里用到了java.util.zip包下 ...

  3. java解压zip包_Java中文件的压缩与解压,每天进步一点点系列

    使用java.util.zip包,实现文件的压缩与解压,并提供了下载方法 注意 无论是调用createNewFile()创建文件,还是在创建输出流时由输出流负责创建文件,都必须保证父路径已经存在,否则 ...

  4. Java 中调用 Apache API 实现图片文件的 压缩 与 解压 实例

    < Java 中调用 Apache API 实现图片文件的 压缩 与 解压 > 为什么不直接使用 Java JDK 中自带的 API 呢?必须使用 Apache API 实现文件的压缩与解 ...

  5. java tar.gz 格式多文件打包压缩与解压

    问题背景:开发中,我们时常会遇到对文件进行存储或传输的问题,但如果传输储存的文件较大,浪费磁盘空间不说,还会大大影响程序运行效率.于是便引出了这篇文章的主题,关于文件打包与压缩的问题.这里" ...

  6. Python 技术篇-用zipfile库进行zip文件的压缩与解压实例演示,python压缩本地文件夹为zip文件并保留目录结构

    首先给大家演示下 zip 文件的解压方法. import zipfiledef zip_extract_to(path_zip, path_aim):'''作用:解压压缩包参数一:压缩包位置参数二:解 ...

  7. 完美java.util.zip使用,实现zip压缩和解压

    之前找了很多demo代码在压缩中遇到各种问题,中文乱码.文本内容丢失等. 以下教程是本人亲自测试过,通过java.util.zip包实现java代码的文件zip压缩和解压: 1.压缩: 1)压缩一个文 ...

  8. Java 压缩与解压zip文件

    一.压缩文件大致可以分为三种:ZIP.JAR.GZ. 压缩流 在日常中经常会使用到像WinRAR或WinZIP这样的压缩文件,通过这些软件可以把一个很大的文件进行压缩以方便传输. 在JAVA中,为了减 ...

  9. Java实现文件压缩与解压[zip格式,gzip格式]

    原文:http://www.cnblogs.com/visec479/p/4112881.html#3069573 Java实现ZIP的解压与压缩功能基本都是使用了Java的多肽和递归技术,可以对单个 ...

最新文章

  1. Python-EEG工具库MNE-Python详细安装与使用
  2. Linux 命令 sudo 用法及配置解析
  3. Vue中通过Axios向SpringBoot发送get和post请求
  4. HTTP和HTTPS总结
  5. LInux:shell 命令:字符串截取
  6. 同学们对《现代软件工程》课程的意见
  7. 第 4 节:前端面试指南 — JavaScript篇
  8. Docker、CentOS 8遭弃用,GPT-3、M1芯片撼动技术圈,盘点2020影响开发者的十大事件!
  9. Egret入门学习日记 --- 第十九篇(书中 8.8~8.10 节 内容)
  10. WCF入门(七)——异常处理1
  11. 解决对象转json字符串时对象属性不按对象属性顺序的问题
  12. 蓝桥杯嵌入式备赛手册
  13. 本文介绍在Wireshark网络协议分析仪中如果解密SSL和TLS流量
  14. Windows最简单的重装系统
  15. 2019数学建模F:数字货币存在是否合理?提供一些思路供思考
  16. Guys, what is better than sex?
  17. Linux学习~树莓派gpio控制
  18. 分享一个云端电脑(让你的电脑少装几十款软件)
  19. CSDN 编程竞赛二十一期题解
  20. 西门子变频器参数设置【转】

热门文章

  1. win11退回win10一直黑屏转圈怎么办 win11退回win10黑屏转圈的解决方法
  2. ros机器人写字,svg图片绘制,二三阶贝塞尔计算公式转代码
  3. Netty网络编程聊天项目
  4. 清掉数据_学习之大数据项目笔记第七篇【数仓模块-日志预处理篇】
  5. opencv3.4.0在ubuntu16.04上的安装
  6. matlab blms算法程序,LMS算法Matlab程序
  7. OpenCV Sobel和Scharr (索贝尔和夏尔滤波器检测边缘)
  8. Python学习—2048小游戏等4个小练习
  9. 关于Python常见功能使用的博客收藏
  10. DirectX 学习笔记