Java 压缩文件夹工具类(包含解压)
依赖jar
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.18</version>
</dependency>
CompressUtils.java
package utils; import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.Objects; import org.apache.commons.compress.archivers.ArchiveEntry;
import org.apache.commons.compress.archivers.ArchiveInputStream;
import org.apache.commons.compress.archivers.ArchiveOutputStream;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
import org.apache.commons.compress.utils.IOUtils; /**
* 压缩文件夹工具类
*
*/
public class CompressUtils { /**
* 压缩文件夹到指定zip文件
*
* @param srcDir 源文件夹
* @param targetFile 目标知道zip文件
* @throws IOException IO异常,抛出给调用者处理
*/
public static void zip(String srcDir, String targetFile) throws IOException { try (
OutputStream outputStream = new FileOutputStream(targetFile);
) {
zip(srcDir, outputStream);
}
} /**
* 压缩文件夹到指定输出流中,可以是本地文件输出流,也可以是web响应下载流
*
* @param srcDir 源文件夹
* @param outputStream 压缩后文件的输出流
* @throws IOException IO异常,抛出给调用者处理
*/
public static void zip(String srcDir, OutputStream outputStream) throws IOException {
try (
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);
ArchiveOutputStream out = new ZipArchiveOutputStream(bufferedOutputStream);
) {
Path start = Paths.get(srcDir);
Files.walkFileTree(start, new SimpleFileVisitor<Path>() { @Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
ArchiveEntry entry = new ZipArchiveEntry(dir.toFile(), start.relativize(dir).toString());
out.putArchiveEntry(entry);
out.closeArchiveEntry();
return super.preVisitDirectory(dir, attrs);
} @Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
try (
InputStream input = new FileInputStream(file.toFile())
) {
ArchiveEntry entry = new ZipArchiveEntry(file.toFile(), start.relativize(file).toString());
out.putArchiveEntry(entry);
IOUtils.copy(input, out);
out.closeArchiveEntry();
}
return super.visitFile(file, attrs);
} }); }
} /**
* 解压zip文件到指定文件夹
*
* @param zipFileName 源zip文件路径
* @param destDir 解压后输出路径
* @throws IOException IO异常,抛出给调用者处理
*/
public static void unzip(String zipFileName, String destDir) throws IOException {
try (
InputStream inputStream = new FileInputStream(zipFileName);
) {
unzip(inputStream, destDir);
} } /**
* 从输入流中获取zip文件,并解压到指定文件夹
*
* @param inputStream zip文件输入流,可以是本地文件输入流,也可以是web请求上传流
* @param destDir 解压后输出路径
* @throws IOException IO异常,抛出给调用者处理
*/
public static void unzip(InputStream inputStream, String destDir) throws IOException {
try (
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
ArchiveInputStream in = new ZipArchiveInputStream(bufferedInputStream);
) {
ArchiveEntry entry = null;
while (Objects.nonNull(entry = in.getNextEntry())) {
if (in.canReadEntryData(entry)) {
File file = Paths.get(destDir, entry.getName()).toFile();
if (entry.isDirectory()) {
if (!file.exists()) {
file.mkdirs();
}
} else {
try (
OutputStream out = new FileOutputStream(file);
) {
IOUtils.copy(in, out);
}
}
} else {
System.out.println(entry.getName());
}
}
} } }
.
Java 压缩文件夹工具类(包含解压)的更多相关文章
- 文件夹工具类 - FolderUtils
文件夹工具类,提供创建完整路径的方法. 源码如下:(点击下载 -FolderUtils.java .commons-io-2.4.jar ) import java.io.File; import o ...
- 简单测试Demo:如何用Java压缩文件夹和文件
一.直接贴出测试代码 package com.jason.zip; import java.io.File; import java.io.FileInputStream; import java.i ...
- 删除文件夹工具类 DeleteFolder.java
package com.util; import java.io.File; /** * 删除文件夹 * @createTime DSC 20, 2010 15:38 * @version 2.0 * ...
- java将文件打包成ZIP压缩文件的工具类实例
package com.lanp; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import ja ...
- C#压缩文件夹至zip,不包含所选文件夹【转+修改】
转自园友:jimcsharp的博文C#实现Zip压缩解压实例[转] 在此基础上,对其中的压缩文件夹方法略作修正,并增加是否对父文件夹进行压缩的方法.(因为笔者有只压缩文件夹下的所有文件,却不想将选中的 ...
- Java操作文件夹的工具类
Java操作文件夹的工具类 import java.io.File; public class DeleteDirectory { /** * 删除单个文件 * @param fileName 要删除 ...
- 使用java API进行zip递归压缩文件夹以及解压
一.概述 在本篇文章中,给大家介绍一下如何将文件进行zip压缩以及如何对zip包解压.所有这些都是使用Java提供的核心库java.util.zip来实现的. 二.压缩文件 首先我们来学习一个简单的例 ...
- ZIP解压缩文件的工具类【支持多级文件夹|全】
ZIP解压缩文件的工具类[支持多级文件夹|全] 作者:Vashon 网上有非常多的加压缩演示样例代码.可是都仅仅是支持一级文件夹的操作.假设存在多级文件夹的话就不行了. 本解压缩工具类经过多次检查及重 ...
- C#利用SharpZipLib解压或压缩文件夹实例操作
最近要做一个项目涉及到C#中压缩与解压缩的问题的解决方法,大家分享. 这里主要解决文件夹包含文件夹的解压缩问题. )下载SharpZipLib.dll,在http://www.icsharpcode. ...
随机推荐
- Web前端常见问题
一.理论知识 1.1.讲讲输入完网址按下回车,到看到网页这个过程中发生了什么 a. 域名解析 b. 发起TCP的3次握手 c. 建立TCP连接后发起http请求 d. 服务器端响应http请求,浏览器 ...
- js学习笔记 -- 随记
js不区分整数和浮点数,统一用Number表示, js'=='比较会自动转换类型,会产生奇怪结果,'==='不会转换比较类型,如果不一致返回false,因此js判断始终用'===' `` 保留换行,也 ...
- inventor安装失败怎样卸载安装inventor 2016?
AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...
- maya2012无法安装卸载激活失败
AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...
- (转)使用HMC接管通过串口或显卡安装的分区操作系统
使用HMC接管通过串口或显卡安装的分区操作系统 原文:http://m.blog.itpub.net/23135684/viewspace-1062084/ 这是一个真实的案例,客户有一台P550的服 ...
- Kudu1.1.0 、 Kudu1.2.0 Kudu1.3.0的版本信息异同比较
不多说,直接上干货! Kudu1.1.0 新特性 python API升级,具备JAVA C++client一样的功能(从0.3版本直接升级到1.1),主要的点如下: 1.1. 改进了Parial ...
- https的设计原理
参考文章: https://www.cnblogs.com/zhangshitong/p/6478721.html http://blog.jobbole.com/113883/ 这两篇文章写的非常好 ...
- SpringBoot如何集成Jedis
添加jedis依赖 在项目pom.xml文件中添加依赖 <!-- 添加jedis依赖 --> <dependency> <groupId>redis.clients ...
- promise之nodejsQ的详细用法总结
这里主要讲node.js中Q的各种用法及说明总结,不详细介绍promise及原理.关于promise介绍可以查看我的另一篇文章: https://www.cnblogs.com/yzeng/p/976 ...
- Vue.js - Day2
品牌管理案例 添加新品牌 删除品牌 根据条件筛选品牌 1.x 版本中的filterBy指令,在2.x中已经被废除: filterBy - 指令 <tr v-for="item in ...