Java把文件压缩成.zip压缩包和解压.zip压缩包(ZipOutputStream、ZipInputStream)
文章目录
- 压缩成.zip
- 解压.zip
压缩成.zip
代码如下:
/*** 压缩成ZIP** @param srcDir 压缩文件夹路径* @param out 压缩文件输出流* @throws RuntimeException 压缩失败会抛出运行时异常*/public static void toZip(String srcDir, OutputStream out) throws RuntimeException {long start = System.currentTimeMillis();ZipOutputStream zos = null;try {zos = new ZipOutputStream(out);File sourceFile = new File(srcDir);compress(sourceFile, zos, sourceFile.getName(), false);long end = System.currentTimeMillis();System.out.println("压缩完成,耗时:" + (end - start) + " ms");} catch (Exception e) {throw new RuntimeException("zip error from ZipUtils", e);} finally {if (zos != null) {try {zos.close();} catch (IOException e) {e.printStackTrace();}}}
}/*** 递归压缩方法** @param sourceFile 源文件* @param zos zip输出流* @param name 压缩后的名称* @param KeepDirStructure 是否保留原来的目录结构,true:保留目录结构;* <p>* false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)* @throws Exception*/
private static void compress(File sourceFile, ZipOutputStream zos, String name,boolean KeepDirStructure) throws Exception {byte[] buf = new byte[BUFFER_SIZE];if (sourceFile.isFile()) {// 向zip输出流中添加一个zip实体,构造器中name为zip实体的文件的名字zos.putNextEntry(new ZipEntry(name));// copy文件到zip输出流中int len;FileInputStream in = new FileInputStream(sourceFile);while ((len = in.read(buf)) != -1) {zos.write(buf, 0, len);}// Complete the entryzos.closeEntry();in.close();} else {File[] listFiles = sourceFile.listFiles();if (listFiles == null || listFiles.length == 0) {// 需要保留原来的文件结构时,需要对空文件夹进行处理if (KeepDirStructure) {// 空文件夹的处理zos.putNextEntry(new ZipEntry(name + "/"));// 没有文件,不需要文件的copyzos.closeEntry();}} else {for (File file : listFiles) {// 判断是否需要保留原来的文件结构if (KeepDirStructure) {// 注意:file.getName()前面需要带上父文件夹的名字加一斜杠,// 不然最后压缩包中就不能保留原来的文件结构,即:所有文件都跑到压缩包根目录下了compress(file, zos, name + "/" + file.getName(), KeepDirStructure);} else {compress(file, zos, file.getName(), KeepDirStructure);}}}}}
测试验证代码:
/*** 测试打包本地的Navicat,输出为zip文件* @throws Exception*/
@Test
public void test() throws Exception {//Navicat路径String inDir = "E:\\developer\\Navicat";//打包后输出路径String outDir = "E:\\developer\\NavicatZip\\Navicat.zip";OutputStream fileOutputStream = new FileOutputStream(new File(outDir));ZipUtils.toZip(inDir, fileOutputStream);
}
打包前后的文件如下:
解压.zip
代码如下:
/*** 解压zip文件到指定目录* @param fileZip* @param path_to_dest* @throws IOException*/
public static void readZip(String fileZip,String path_to_dest) throws IOException {try (FileInputStream fis = new FileInputStream(fileZip);ZipInputStream zis =new ZipInputStream(new BufferedInputStream(fis))) {ZipEntry entry;// 从ZipInputStream读取每个条目,直到没有// 发现更多条目,返回值为空// getNextEntry()方法。while ((entry = zis.getNextEntry()) != null) {System.out.println("Unzipping: " + entry.getName());int size;byte[] buffer = new byte[2048];File fileOut = new File(path_to_dest+"\\"+entry.getName());try (FileOutputStream fos =new FileOutputStream(fileOut);BufferedOutputStream bos =new BufferedOutputStream(fos, buffer.length)) {while ((size = zis.read(buffer, 0, buffer.length)) != -1) {bos.write(buffer, 0, size);}bos.flush();}}} catch (IOException e) {e.printStackTrace();}
}
测试验证代码:
/*** 测试解压本地zip文件* @throws Exception*/
@Test
public void readZip() throws Exception {//解压后路径String path_to_dest = "E:\\developer\\NavicatUnzip";//zip文件路径String fileZip = "E:\\developer\\NavicatZip\\Navicat.zip";ZipUtils.readZip(fileZip, path_to_dest);
}
解压前后的文件如下:
Java把文件压缩成.zip压缩包和解压.zip压缩包(ZipOutputStream、ZipInputStream)相关推荐
- java 把文件压缩成zip文件
ackage org.fh.util;import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStr ...
- Windows中将文件压缩成linux支持的tar.gz格式的压缩包
场景 CentOS7的服务器,本机是Windows的系统,需要从Windows上将文件打成压缩包 然后上传到linux服务器上. 如果直接在Windows上将文件打成zip或者rar这种的压缩文件的话 ...
- Spring Boot 实现将多个MinIO文件压缩成压缩包并下载至本地
1 Maven依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all< ...
- kettle将多个文件压缩_如何使用WinRAR将一个大文件压缩成多个小的压缩包
目录 1.使用WinRAR将一个大文件压缩成多个小的压缩包 2.使用WinRAR将多个小的压缩包,解压/合并成一个大文件 3.结尾 / 在现实生活中,受文件大小的限制,在传输的过程往往出现困难,如:邮 ...
- 如何使用WinRAR将一个大文件压缩成多个小的压缩包
目录 1.使用WinRAR将一个大文件压缩成多个小的压缩包 2.使用WinRAR将多个小的压缩包,解压/合并成一个大文件 3.结尾 推荐阅读(单击下方即可跳转): 如何使用7-Zip将一个大文件压缩成 ...
- 使用java iTest实现PDF大文件压缩——将文件过大的图片PDF文件压缩成小一些的图片PDF文件
一.需求 项目中需要将文件大小过大的PDF文件,压缩成小PDF文件.通过iText的API,可以实现此需求.在保证文件不失真的前提下,将PDF大文件压缩成小文件. 二.代码 import com.it ...
- C#利用自带的ZipFile压缩和解压zip文件,超级简单
ZipFile类是.NET Framework 4.5发布的一个C#压缩文件和解压zip文件的一个类库,它支持.NET Framework 4.5以上版本,包括.NET Core1.0和.NET5以上 ...
- Java多文件压缩下载解决方案
Java多文件压缩下载解决方案 需求: 会员运营平台经过改版后页面增加了许多全部下载链接,上周上线比较仓促,全部下载是一个直接下载ZIP压缩文件的链接,每个ZIP压缩文件都是由公司运营人员将页面需要下 ...
- java mp3文件压缩_java实现文件压缩
java实现文件压缩:主要是流与流之间的传递 代码如下: package com.cst.klocwork.service.zip; import java.io.File; import java. ...
最新文章
- python文本分类评价指标 top1如何计算_python – Keras:如何计算多标签分类的准确......
- linux7.3搭建dns,Centos7.3搭建DNS服务器--BIND
- 车品觉 | 大数据的价值:找到别人的“集体智慧”
- as常用固定搭配_英语考试干货!205个常用介词固定搭配
- “@react-navigation/native“).createNavigatorFactory) is not a function.
- 入门第十一课 Python语句的嵌套
- Vue如何循环提取对象数组中的值
- python-packaging 命令行脚本
- php 解析lrc文件格式,PHP - 四级单词lrc文件解析为txt
- Linux之df命令
- 基于内容的图像检索概述
- spring mvc 自定义编辑器
- 多个Excel文件合并成一个文件
- Java-Lambda表达式第一篇认识Lambda表达式
- Linux系统镜像源替换
- android触摸屏原理,智能手机触摸屏的工作原理是如何的
- 56: Recv failure: Connection was reset和55错误解决办法
- Ubuntu16.04下安装QQ的完整操作记录(经验证可用)
- 单细胞测序数据下载和预处理
- “追梦五年”主题征文『51CTO五周年庆』