利用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 ...
随机推荐
- 关于torch.nn.LSTM()的输入和输出
主角torch.nn.LSTM() 初始化时要传入的参数 | Args: | input_size: The number of expected features in the input `x` ...
- 牛客OI测试赛2
题目链接:https://www.nowcoder.com/acm/contest/185#question A.无序组数 暴力求出A和B的因子,注意二元组是无序的,因此还要考虑有些因子在A和B中都存 ...
- Requests方法 --- json模块
1.Json 简介:Json,全名 JavaScript Object Notation,是一种轻量级的数据交换格式,常用于 http 请求中 2.可以用 help(json),查看对应的源码注释内容 ...
- 【spring源码系列】之【Bean的循环依赖】
希望之光永远向着目标清晰的人敞开. 1. 循环依赖概述 循环依赖通俗讲就是循环引用,指两个或两个以上对象的bean相互引用对方,A依赖于B,B依赖于A,最终形成一个闭环. Spring循环依赖的场景有 ...
- 【并查集模板】并查集模板 luogu-3367
题目描述 简单的并查集模板 输入描述 第一行包含两个整数N.M,表示共有N个元素和M个操作. 接下来M行,每行包含三个整数Zi.Xi.Yi 当Zi=1时,将Xi与Yi所在的集合合并 当Zi=2时,输出 ...
- vulnhub-DC:1靶机渗透记录
准备工作 在vulnhub官网下载DC:1靶机https://www.vulnhub.com/entry/dc-1,292/ 导入到vmware 打开kali准备进行渗透(ip:192.168.200 ...
- java学习笔记之OOP(二)
java学习笔记二.面向对象[OOP]Object Oriented Programming 一.三大特性: 1.封装:隐藏对象的属性和实现细节,仅对外提供公共访问方式,将变化隔离,便于使用,提高复用 ...
- 渗透测试思路 - CTF(番外篇)
渗透测试思路 Another:影子 (主要记录一下平时渗透的一些小流程和一些小经验) CTF(番外篇) 笔者是一个WEB狗,更多的是做一些WEB类型题目,只能怪笔者太菜,哭~~ 前言 本篇 ...
- [洛谷P3376题解]网络流(最大流)的实现算法讲解与代码
[洛谷P3376题解]网络流(最大流)的实现算法讲解与代码 更坏的阅读体验 定义 对于给定的一个网络,有向图中每个的边权表示可以通过的最大流量.假设出发点S水流无限大,求水流到终点T后的最大流量. 起 ...
- Arp欺骗和DNS投毒
中间人攻击 ARP缓存攻击 ARP(Address Resolution Protocol,地址解析协议)是一个位于TCP/IP协议栈中的网络层,负责将某个IP地址解析成对应的MAC地址.简单来说,就 ...