利用Java进行zip文件压缩与解压缩
摘自:
https://www.cnblogs.com/alphajuns/p/12442315.html
工具类:
package com.alphajuns.util; 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.Enumeration;
import java.util.List; import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream; /**
* @ClassName ZipUtil
* @Description 压缩或解压缩zip:由于直接使用java.util.zip工具包下的类,会出现中文乱码问题,所以使用ant.jar中的org.apache.tools.zip下的工具类
* @Author AlphaJunS
* @Date 2020/3/8 11:30
* @Version 1.0
*/
public class ZipUtil { /**
* @Author AlphaJunS
* @Date 11:32 2020/3/8
* @Description
* @param zip 压缩目的地址
* @param srcFiles 压缩的源文件
* @return void
*/
public static void zipFile( String zip , File[] srcFiles ) {
try {
if( zip.endsWith(".zip") || zip.endsWith(".ZIP") ){
FileOutputStream fos = new FileOutputStream(new File(zip));
ZipOutputStream _zipOut = new ZipOutputStream(fos) ;
_zipOut.setEncoding("GBK");
for( File _f : srcFiles ){
handlerFile(zip , _zipOut , _f , "");
}
fos.close();
_zipOut.close();
}else{
System.out.println("target file[" + zip + "] is not .zip type file");
}
} catch (FileNotFoundException e) {
} catch (IOException e) {
}
} /**
* @Author AlphaJunS
* @Date 11:33 2020/3/8
* @Description
* @param zip 压缩的目的地址
* @param zipOut
* @param srcFile 被压缩的文件信息
* @param path 在zip中的相对路径
* @return void
*/
private static void handlerFile(String zip , ZipOutputStream zipOut , File srcFile , String path) throws IOException {
System.out.println(" begin to compression file[" + srcFile.getName() + "]");
if( !"".equals(path) && ! path.endsWith(File.separator)){
path += File.separator ;
}
if( ! srcFile.getPath().equals(zip) ){
if( srcFile.isDirectory() ){
File[] _files = srcFile.listFiles() ;
if( _files.length == 0 ){
zipOut.putNextEntry(new ZipEntry( path + srcFile.getName() + File.separator));
zipOut.closeEntry();
}else{
for( File _f : _files ){
handlerFile( zip ,zipOut , _f , path + srcFile.getName() );
}
}
}else{
InputStream _in = new FileInputStream(srcFile) ;
zipOut.putNextEntry(new ZipEntry(path + srcFile.getName()));
int len = 0 ;
byte[] _byte = new byte[1024];
while( (len = _in.read(_byte)) > 0 ){
zipOut.write(_byte, 0, len);
}
_in.close();
zipOut.closeEntry();
}
}
} /**
* @Author AlphaJunS
* @Date 11:34 2020/3/8
* @Description 解压缩ZIP文件,将ZIP文件里的内容解压到targetDIR目录下
* @param zipPath 待解压缩的ZIP文件名
* @param descDir 目标目录
* @return java.util.List<java.io.File>
*/
public static List<File> unzipFile(String zipPath, String descDir) {
return unzipFile(new File(zipPath) , descDir) ;
} /**
* @Author AlphaJunS
* @Date 11:36 2020/3/8
* @Description 对.zip文件进行解压缩
* @param zipFile 解压缩文件
* @param descDir 压缩的目标地址,如:D:\\测试 或 /mnt/d/测试
* @return java.util.List<java.io.File>
*/
@SuppressWarnings("rawtypes")
public static List<File> unzipFile(File zipFile, String descDir) {
List<File> _list = new ArrayList<File>() ;
try {
ZipFile _zipFile = new ZipFile(zipFile , "GBK") ;
for( Enumeration entries = _zipFile.getEntries() ; entries.hasMoreElements() ; ){
ZipEntry entry = (ZipEntry)entries.nextElement() ;
File _file = new File(descDir + File.separator + entry.getName()) ;
if( entry.isDirectory() ){
_file.mkdirs() ;
}else{
File _parent = _file.getParentFile() ;
if( !_parent.exists() ){
_parent.mkdirs() ;
}
InputStream _in = _zipFile.getInputStream(entry);
OutputStream _out = new FileOutputStream(_file) ;
int len = 0 ;
byte[] _byte = new byte[1024];
while( (len = _in.read(_byte)) > 0){
_out.write(_byte, 0, len);
}
_in.close();
_out.flush();
_out.close();
_list.add(_file) ;
}
}
} catch (IOException e) {
}
return _list ;
} /**
* @Author AlphaJunS
* @Date 11:36 2020/3/8
* @Description 对临时生成的文件夹和文件夹下的文件进行删除
* @param delpath
* @return void
*/
public static void deletefile(String delpath) {
try {
File file = new File(delpath);
if (!file.isDirectory()) {
file.delete();
} else if (file.isDirectory()) {
String[] fileList = file.list();
for (int i = 0; i < fileList.length; i++) {
File delfile = new File(delpath + File.separator + fileList[i]);
if (!delfile.isDirectory()) {
delfile.delete();
} else if (delfile.isDirectory()) {
deletefile(delpath + File.separator + fileList[i]);
}
}
file.delete();
}
} catch (Exception e) {
e.printStackTrace();
}
} }
测试类:
@Test
public void testZip() {
String filePath = "D:\\pdfTest\\合格压缩文件.zip";
// 获取原文所在目录
// 服务器上时,文件路径为“/”,此处测试需要换成filePath中的“\\”
//String oldFilePath = filePath.substring(0, filePath.lastIndexOf("/"));
String oldFilePath = filePath.substring(0, filePath.lastIndexOf("\\"));
System.out.println("原文件路径:" + oldFilePath);
// 临时目录,原压缩文件解压目录
String destDirPath = oldFilePath + "\\tmp\\";
System.out.println("临时路径:" + destDirPath);
// 将原压缩文件解压到临时目录
ZipUtil.unzipFile(filePath, destDirPath); // 临时目录文件对象
File destDir = new File(destDirPath);
// 获取临时目录下的所有文件
File[] files = destDir.listFiles();
// 定义变量,保存校验结果
List<Integer> list = new ArrayList<>();
// 遍历文件,进行校验
for (File file: files) {
String absolutePath = file.getAbsolutePath();
System.out.println(absolutePath);
int i = CheckPdfHelper.checkPdf(absolutePath);
list.add(i);
// 压缩包中存在不合格PDF文件时
if (i != 0) {
break;
}
}
// 判断是否包含不合格PDF文件
if (list.contains(1)) {
System.out.println("压缩文件中包含不合格PDF文件");
// 删除解压缩的文件和临时目录
ZipUtil.deletefile(destDirPath);
// 不合格时,不生成新的压缩包文件
return;
} else {
System.out.println("压缩文件PDF文件均符合要求");
} // 获取原压缩文件后缀
int pos = filePath.lastIndexOf('.');
String suffix = filePath.substring(pos + 1);
// 新生成压缩文件路径
String newFilePath = filePath.substring(0, pos) + ".PSW." + suffix;
System.out.println("新的压缩文件路径:" + newFilePath); // 将检验成功的文件压缩成一个新的压缩包
ZipUtil.zipFile(newFilePath, files);
// 删除临时目录
ZipUtil.deletefile(destDirPath);
}
maven包:
<dependencies>
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant</artifactId>
<version>1.9.7</version>
</dependency>
</dependencies>
利用Java进行zip文件压缩与解压缩的更多相关文章
- Java /C# 实现文件压缩
纯粹为了记录. 参考了 https://www.cnblogs.com/zeng1994/p/7862288.html import java.util.List; import java.util. ...
- Java对zip格式压缩和解压缩
Java对zip格式压缩和解压缩 通过使用java的相关类可以实现对文件或文件夹的压缩,以及对压缩文件的解压. 1.1 ZIP和GZIP的区别 gzip是一种文件压缩工具(或该压缩工具产生的压缩文件格 ...
- Huffman的应用之文件压缩与解压缩
文件压缩与解压缩> 近期这段时间一直在学习树的这样的数据结构,也接触到了Huffman树以及了解了什仫是Huffman编码,而我们经常使用的zip压缩也是利用的Huffman编码的特性 ...
- Linux文件压缩、解压缩及归档工具一
主题Linux文件压缩.解压缩及归档工具 压缩工具很重要的,因为要经常到互联网下载包 一compress/uncompress compress [-dfvcVr] [-b maxbits] [fil ...
- java 生成zip文件并导出
总结一下,关于Java下载zip文件并导出的方法,浏览器导出. String downloadName = "下载文件名称.zip"; downloadName = Browser ...
- [Java 基础] 使用java.util.zip包压缩和解压缩文件
reference : http://www.open-open.com/lib/view/open1381641653833.html Java API中的import java.util.zip ...
- Android zip文件压缩解压缩
DirTraversal.java <P style="TEXT-ALIGN: left; PADDING-BOTTOM: 0px; WIDOWS: 2; TEXT-TRANSFORM ...
- Java用ZIP格式压缩和解压缩文件
转载:java jdk实例宝典 感觉讲的非常好就转载在这保存! java.util.zip包实现了Zip格式相关的类库,使用格式zip格式压缩和解压缩文件的时候,须要导入该包. 使用zipoutput ...
- java实现将文件压缩成zip格式
以下是将文件压缩成zip格式的工具类(复制后可以直接使用): zip4j.jar包下载地址:http://www.lingala.net/zip4j/download.php package util ...
随机推荐
- Kubernetes全栈架构师(二进制高可用安装k8s集群部署篇)--学习笔记
目录 二进制高可用基本配置 二进制系统和内核升级 二进制基本组件安装 二进制生成证书详解 二进制高可用及etcd配置 二进制K8s组件配置 二进制使用Bootstrapping自动颁发证书 二进制No ...
- python 抓取异常
aa={"a":2,"b":1} for i in range(10): aa["a"]=aa["a"]-i print ...
- 你好,我是B树
一.什么是B树? B树是一棵是具备以下特点的有根树. 1.节点属性 a)x.n:为节点中存储的关键字个数. b)x.key:为节点中存储的关键字.x.key1.x.key2 ... x.keyx.n ...
- 基于IDEA的JAVA开发[第一集]:在Linux上安装IDEA
1,因为买了荣耀的magicbook pro 锐龙版,系统是Linux,以后打算直接在Linux上开发.本来熟悉Myeclipse,下载了Myeclipse2017 for Linux,但是安装中出现 ...
- 正则表达式的模式匹配----V客学院技术分享
正则表达式是由一个字符序列形成的搜索模式. 你在文本中搜索数据时,你可以用搜索模式来描述你要查询的内容. 正则表达式可以是一个简单的字符,或一个更复杂的模式. 正则表达式可用于所有文本搜索和文本替换的 ...
- Python基础之函数的闭包与装饰器的介绍
1.闭包的概念: 如果在一个函数中,定义了另外一个函数,并且那个函数使用了外面函数的变量,并且外面那个函数返回了里面这个函数的引用,那么称为里面的这个函数为闭包. 2.话不多说,以demo示例: de ...
- pytest框架
1.添加日志 import logging logging.debug('This is debug message') logging.info('This is info message') lo ...
- py3射击小游戏
关于py3面向对象的小Demo,欢迎 交流. class Person(object):#声明人类 def __init__(self,name): self.name = name self.gun ...
- git学习心得之git跨分支提交代码
最近在工作中遇到了git跨分支提交代码的问题,本地拉的是远程master分支的代码,需要将本地修改代码提交到远程temp分支. 1.在gitlab上对相应项目fork本地分支 2.更新本地代码,将远程 ...
- C#曲线分析平台的制作(二,echarts前后台数据显示)
在上一篇博客中,学习了使用javascript和jquery两种方法来进行前后台交互.本篇博客着重利用jquery+echarts来实现从后台取数,从前端echarts中展示. 1.html页面编写: ...