package com.auo.Utils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.compress.archivers.sevenz.SevenZArchiveEntry;
import org.apache.commons.compress.archivers.sevenz.SevenZFile;
import java.io.*;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Enumeration;
import java.util.concurrent.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
/**
* zip文件解压
* @author fhadmin
* @from fhadmin.cn
*/
@Slf4j
public class ZipUtils {
// public static void main(String[] args) throws IOException {
ZipHandler zipHandler = new ZipHandler();
zipHandler.decompress("F:/test.zip", "F:/test/");
// String filePath = "C:\\Users\\260481\\Desktop\\1ORIGIN_DATA_LIST_1610090555026_spark9.zip";
// File fil = new File(filePath);
// InputStream fileInputStream = new FileInputStream(fil);
// Path path = Paths.get("business","src", "main", "resources", "static", "1ORIGIN_DATA_LIST_1610615443346_测试.zip");
// File file1 = path.getParent().toFile();
// if (!file1.exists()){
// file1.mkdirs();
// }
// Files.copy(fileInputStream,path);
// File file = path.toFile();
// ZipUtils zipHandler = new ZipUtils();
// Path path1 = Paths.get("business","src", "main", "resources", "static");
// zipHandler.decompress(file,path1.toString());
// }
//解压方法
public void decompress(File srcFile, String destDirPath){
//判断是zip格式 还是 7z格式
if (srcFile.getName().toLowerCase().endsWith(".zip")){
try {
decompressZIP(srcFile, destDirPath);
} catch (IOException e) {
e.printStackTrace();
}
}else if (srcFile.getName().toLowerCase().endsWith(".7z")){
try {
decompress7Z(srcFile, destDirPath);
} catch (Exception e) {
e.printStackTrace();
}
}
//解压完成后,删除压缩包方法,以及空文件夹
File parentFile = srcFile.getParentFile();
boolean delete = srcFile.delete();
if (!delete){
log.error("删除文件"+srcFile.getName()+"失败");
}
if (parentFile.isDirectory() && (parentFile.listFiles() == null || parentFile.listFiles().length<=0)){
log.info("删除文件夹"+parentFile.getName()+parentFile.delete());
}
}
private void decompress7Z(File srcFile, String destDirPath) throws Exception {
/**
* zip解压
* @param inputFile 待解压文件名
* @param destDirPath 解压路径
*/
// File srcFile = new File(inputFile);//获取当前压缩文件
// 判断源文件是否存在
if (!srcFile.exists()) {
throw new Exception(srcFile.getPath() + "所指文件不存在");
}
//开始解压
long start = System.currentTimeMillis();
SevenZFile zIn = new SevenZFile(srcFile);
SevenZArchiveEntry entry = null;
File file = null;
while ((entry = zIn.getNextEntry()) != null) {
if (!entry.isDirectory()) {
String name = entry.getName();
file = new File(destDirPath, name);
saveFile(zIn, file,destDirPath);
}
}
zIn.close();
long end = System.currentTimeMillis();
log.info("解压"+srcFile.getName()+"耗时"+(end-start)+"毫秒");
}
private void saveFile(SevenZFile zIn, File file, String destDirPath) {
String toLowerCase = file.getName().toLowerCase();
//校验文件后缀
if (!file.exists() && (verifySuffix(toLowerCase) || toLowerCase.endsWith(".zip")|| toLowerCase.endsWith(".7z"))) {
new File(file.getParent()).mkdirs();//创建此文件的上级目录
try(OutputStream out = new FileOutputStream(file);
BufferedOutputStream bos = new BufferedOutputStream(out);) {
int len = -1;
byte[] buf = new byte[1024];
while ((len = zIn.read(buf)) != -1) {
bos.write(buf, 0, len);
}
} catch (IOException e) {
log.error(file.getName() + "文件创建失败");
}
if (file.getName().endsWith(".7z") || file.getName().endsWith(".zip")){
try {
decompress(file, destDirPath);
// boolean delete = file.delete();
// System.out.println("文件删除"+delete);
} catch (Exception e) {
e.printStackTrace();
}
}
} else {
// file = new File(file.getParent(), "(1)" + file.getName());
// saveFile(zIn, file, destDirPath);
}
}
private void decompressZIP(File file, String descDir) throws IOException {
long start = System.currentTimeMillis();
// ZipFile zipFile = new ZipFile(file, Charset.forName("GBK"));
if (!descDir.endsWith(File.separator)) {
descDir = descDir + File.separator;
}
FileInputStream fileInputStream = new FileInputStream(file);
try (ZipInputStream zipInputStream = new ZipInputStream(fileInputStream , Charset.forName("GBK"))) {
ZipEntry zipEntry;
while ((zipEntry = zipInputStream.getNextEntry()) != null) {
String zipEntryNameStr = zipEntry.getName();
String zipEntryName = zipEntryNameStr;
if (zipEntryNameStr.contains("/")) {
String str1 = zipEntryNameStr.substring(0, zipEntryNameStr.indexOf("/"));
zipEntryName = zipEntryNameStr.substring(str1.length() + 1);
}
String outPath = (descDir + zipEntryName).replace("\\\\", "/");
// File outFile = new File(outPath.substring(0, outPath.lastIndexOf('/')));
// if (!outFile.exists()) {
// outFile.mkdirs();
// }
// if (new File(outPath).isDirectory()) {
// continue;
// }
writeFile(outPath, zipInputStream);
zipInputStream.closeEntry();
}
System.out.println("======解压成功=======");
} catch (IOException e) {
System.out.println("压缩包处理异常,异常信息{}" + e);
}
long end = System.currentTimeMillis();
log.info("解压"+file.getName()+"耗时"+(end-start)+"毫秒");
// boolean delete = file.delete();
// if (!delete){
// log.error("删除文件"+file.getName()+"失败");
// }
}
//将流写到文件中
public static void writeFile(String filePath, ZipInputStream zipInputStream) {
try (OutputStream outputStream = new FileOutputStream(filePath)) {
byte[] bytes = new byte[4096];
int len;
while ((len = zipInputStream.read(bytes)) != -1) {
outputStream.write(bytes, 0, len);
}
} catch (IOException ex) {
System.out.println("解压文件时,写出到文件出错");
}
}
// private void decompressZIPThread(File file, String destPath) throws IOException {
// long start = System.currentTimeMillis();
// ZipFile zipFile = new ZipFile(file, Charset.forName("GBK"));
// Enumeration<? extends ZipEntry> entries = zipFile.entries();
// //使用线程池 提交任务 没有工具类 可自己new
// ExecutorService threadPool = ThreadPoolUtil.getInstance();
// int size = zipFile.size();
// final CountDownLatch countDownLatch = new CountDownLatch(size);
// while (entries.hasMoreElements()) {
// ZipEntry zipEntry = entries.nextElement();
// if (zipEntry.isDirectory()) {
// countDownLatch.countDown();
// continue;
// }
// threadPool.execute(new FileWritingTask(zipFile,destPath,zipEntry,countDownLatch));
// }
threadPool.shutdown();
// try {
threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
// countDownLatch.await();
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// zipFile.close();
// long end = System.currentTimeMillis();
// log.info("解压"+file.getName()+"耗时"+(end-start)+"毫秒");
boolean delete = file.delete();
if (!delete){
log.error("删除文件"+file.getName()+"失败");
}
// }
public static boolean verifySuffix(String name) {
String lowerCase = name.toLowerCase();
if (lowerCase.endsWith(".jpg") || lowerCase.endsWith(".jpeg") || lowerCase.endsWith(".png") || lowerCase.endsWith(".bmp")){
return true;
}else {
return false;
}
}
private class FileWritingTask implements Runnable {
private ZipFile zipFile;
private String destPath;
private ZipEntry zipEntry;
private CountDownLatch countDownLatch;
FileWritingTask(ZipFile zipFile, String destPath, ZipEntry zipEntry, CountDownLatch countDownLatch) {
this.zipFile = zipFile;
this.destPath = destPath;
this.zipEntry = zipEntry;
this.countDownLatch = countDownLatch;
}
@Override
public void run() {
try {
String name = zipEntry.getName();
String lowerCaseName = name.toLowerCase();
if (verifySuffix(lowerCaseName)|| lowerCaseName.endsWith(".zip")|| lowerCaseName.endsWith(".7z")){
//保留层级目录 解决文件重名问题
// if (name.lastIndexOf("/")!=-1) {
// name = name.substring(name.lastIndexOf("/")+1);
// }
File file = new File(destPath + File.separator + name);
while(!file.exists() ){
// file=new File(destPath+File.separator+"(1)"+name);
File parentFile = file.getParentFile();
if (!parentFile.exists()) {
parentFile.mkdirs();
}
try {
InputStream inputStream = zipFile.getInputStream(this.zipEntry);
// Path path = Paths.get(parentFile.getPath() + File.separator + name);
//File file1 = new File(path.toString());
while (!file.exists()) {
Files.copy(inputStream,Paths.get(file.getPath()));
}
} catch (IOException e) {
e.printStackTrace();
}
//判断如果是压缩包 递归解压
if (lowerCaseName.endsWith(".zip")|| lowerCaseName.endsWith(".7z")){
String s = destPath + File.separator + name;
File file1 = new File(s);
decompress(file1,destPath);
}
}
}
}finally {
countDownLatch.countDown();
}
}
}
}
文件解压(单文件/批量)
最新推荐文章于 2024-07-22 22:58:19 发布