⽤Java进⾏zip⽂件压缩与解压缩可能存在的业务情况:
1、⽤户上传了压缩包,需校验压缩包中的⽂件是否合格。
2、⽤户上传压缩包,对压缩包中的⽂件进⾏批量⽔印处理
解决思路:
1、读取原压缩包⽂件,解压缩⾄临时⽬录
2、对临时⽬录中的解压缩⽂件进⾏校验/⽔印处理
3、对临时⽬录中处理过的⽂件进⾏压缩
4、删除临时⽬录及其下的⽂件
需要参考前⾯的校验PDF的帖⼦
测试结果如下:
测试代码:
@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 = AbsolutePath();
System.out.println(absolutePath);
int i = CheckPdfHelper.checkPdf(absolutePath);
list.add(i);
// 压缩包中存在不合格PDF⽂件时
if (i != 0) {
break;
}
}
// 判断是否包含不合格PDF⽂件
if (ains(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);
}
ZipUtil⼯具类:
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 ls.zip.ZipEntry;
import ls.zip.ZipFile;
import ls.zip.ZipOutputStream;
/
**
* @ClassName ZipUtil
* @Description 压缩或解压缩zip:由于直接使⽤java.util.zip⼯具包下的类,会出现中⽂乱码问题,所以使⽤ant.jar中的ls.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( dsWith(".zip") || dsWith(".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[" + Name() + "]");
if( !"".equals(path) && ! dsWith(File.separator)){
path += File.separator ;
}
if( ! Path().equals(zip) ){
if( srcFile.isDirectory() ){
File[] _files = srcFile.listFiles() ;
if( _files.length == 0 ){
zipOut.putNextEntry(new ZipEntry( path + Name() + File.separator));          zipOut.closeEntry();
}else{
for( File _f : _files ){
handlerFile( zip ,zipOut , _f , path + Name() );
}
}
}else{
InputStream _in = new FileInputStream(srcFile) ;
zipOut.putNextEntry(new ZipEntry(path + Name()));
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 = _Entries() ; entries.hasMoreElements() ; ){        ZipEntry entry = (Element() ;
File _file = new File(descDir + File.separator + Name()) ;
if( entry.isDirectory() ){
_file.mkdirs() ;
}else{
File _parent = _ParentFile() ;
if( !_ists() ){
_parent.mkdirs() ;
}
InputStream _in = _InputStream(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();
}
}
}
以上就是⽤Java进⾏zip⽂件压缩与解压缩的详细内容,更多关于java zip⽂件压缩与解压缩的资料请关注其它相关⽂章!