利用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 ...
随机推荐
- ASP.NET C# 打包再修改aspx文件报错解决方案
aspx文件最开始: <%@ page language="C#" autoeventwireup="true" inherits="tiddk ...
- 聊聊 Spring AOP 的不为常知的“秘事”
Spring AOP 在我们日常开发中扮演了一个非常重要的角色,对于如何使用 AOP 相信很多人已经不陌生,但其中有一些点却容易被我们忽视,本节我们结合一些"不为常知"的问题展开讨 ...
- fiddler抓取手机模拟器数据
引自:https://blog.csdn.net/lengdaochuqiao/article/details/88170522 1.下载最新版fiddler ,强烈建议在官网下载:https://w ...
- 第十六篇 -- QListWidget与QToolButton(功能)
效果图: 添加的部分,就是对几个action绑定了槽函数,完成相应的功能. listWidget操作的都是item,添加一个item,删除一个item,插入一个item等等.那么只需要知道item的几 ...
- 第十三篇 -- QMainWindow与QAction(新建-打开-保存)
效果图: 添加了三个Action,分别是新建,打开,和保存,没有具体写相应的功能,只是提供了一个接口,可以自己写相应的功能.这次不仅将这些Action放在了工具栏,还将其添加到了菜单栏.方法同样是直接 ...
- redis故障时的一些概念
1.缓存穿透 概念访问一个不存在的key,缓存不起作用,请求会穿透到DB,流量大时DB会挂掉. 解决方案采用布隆过滤器,使用一个足够大的bitmap,用于存储可能访问的key,不存在的key直接被过滤 ...
- C实现奇偶校验
奇偶校验原理(来自百度百科):奇偶校验(Parity Check)是一种校验代码传输正确性的方法.根据被传输的一组二进制代码的数位中"1"的个数是奇数或偶数来进行校验.采用奇数的称 ...
- PHP 接受提交变量过滤类
Filter.class.php : 1 <?php 2 class Filter{ 3 4 /** 5 * 将\n转化为<br/> 6 * 7 * @param stri ...
- 机器学习 - k-means聚类
k-means简介 k-means是无监督学习下的一种聚类算法,简单说就是不需要数据标签,仅靠特征值就可以将数据分为指定的几类.k-means算法的核心就是通过计算每个数据点与k个质心(或重心)之间的 ...
- 浅谈Blazor开发的那些事
在这篇文章中,我们将解决一些常见的Blazor问题.具体来说就是"什么是Blazor",但更重要的是"为什么要用Blazor".既然我们已经有了Angular. ...