概述
代码干货
除了解压压缩的代码之外,我还附加了一个带有一定业务的版本,可以方便大家做业务修改的时候进行比较,让读者大概能知道菜菜修改了哪里,你要怎么修改。异常的定义可以根据业务再细分,我这里只是简单的写了一个
我的业务是解压的时候判断深度不能大于2层,因为解压的时候深度太大会过于影响性能哦。
import com.X.hr.corehr.common.exception.ZipException;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.ZipInputStream;
/**
* 文件解压工具类
*
* @author CabbageDevil
*/
public class ZipUtils {
private static final Logger logger = LoggerFactory.getLogger(ZipUtils.class);
/**
* 解压文件到指定目录 (普普通通的解压MultipartFile 版本)
*
* @param zipFile 需要解压的文件
* @param outPath 输出路径
* @author CabbageDevil
*/
public static List<File> ZipDeco(MultipartFile zipFile, String outPath) throws IOException {
File file = FileUtils.multipartFileToFile(zipFile);
return unZipFiles(file, outPath);
}
/**
* 解压文件到指定目录 (普普通通的解压File 版本)
* 该解压附带目录结构
*
* @param zipFile 需要解压的文件
* @param descDir 输出路径
* @author CabbageDevil
*/
public static List<File> unZipFiles(File zipFile, String descDir) throws IOException {
List<File> returnList = new ArrayList<>();
File pathFile = new File(descDir);
if (!pathFile.exists()) {
pathFile.mkdirs();
}
ZipFile zip = new ZipFile(zipFile, "gbk");
for (Enumeration entries = zip.getEntries(); entries.hasMoreElements(); ) {
ZipEntry entry = (ZipEntry) entries.nextElement();
String zipEntryName = entry.getName();
InputStream in = zip.getInputStream(entry);
String outPath = (descDir + zipEntryName).replaceAll("\*", "/");
;
//判断路径是否存在,不存在则创建文件路径
File file = new File(outPath.substring(0, outPath.lastIndexOf('/')));
if (!file.exists()) {
file.mkdirs();
}
//判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压
if (new File(outPath).isDirectory()) {
continue;
}
//输出文件路径信息
File endFile = new File(outPath);
logger.info(endFile.getPath());
returnList.add(endFile);
OutputStream out = new FileOutputStream(endFile);
byte[] buf1 = new byte[1024];
int len;
while ((len = in.read(buf1)) > 0) {
out.write(buf1, 0, len);
}
in.close();
out.close();
}
logger.info("******************解压完毕********************");
return returnList;
}
/**
* 解压文件到指定目录 (解压判断路径深度是否大于X的MultipartFile 版本)
*
* @param zipFile 需要解压的文件
* @param outPath 输出路径
* @author CabbageDevil
*/
public static List<File> batchUpdateAttachment(MultipartFile zipFile, String outPath) throws Exception {
File file = null;
List<File> returnList;
try {
file = FileUtils.multipartFileToFile(zipFile);
returnList = batchUpdateAttachment(file, outPath);
} catch (Exception e) {
throw e;
} finally {
//删除压缩包
if (null != file) {
FileUtils.deleteFile(file);
}
}
return returnList;
}
/**
* 解压文件到指定目录 (解压判断路径深度是否大于X的File 版本)
*
* @param zipFile 需要解压的文件
* @param descDir 输出路径
* @author CabbageDevil
*/
public static List<File> batchUpdateAttachment(File zipFile, String descDir) throws Exception {
List<File> returnList = new ArrayList<>();
try {
File pathFile = new File(descDir);
if (!pathFile.exists()) {
pathFile.mkdirs();
}
//路径拟构计数器
int count = 0;
ZipFile zip = new ZipFile(zipFile, "gbk");
for (Enumeration entries = zip.getEntries(); entries.hasMoreElements(); ) {
ZipEntry entry = (ZipEntry) entries.nextElement();
String zipEntryName = entry.getName();
InputStream in = zip.getInputStream(entry);
String outPath = (descDir + zipEntryName).replaceAll("\*", "/");
;
//判断路径是否存在,不存在则创建文件路径
File file = new File(outPath.substring(0, outPath.lastIndexOf('/')));
if (!file.exists()) {
file.mkdirs();
}
//拟构文件路径次数大于1则说明路径格式不正确
if (new File(outPath).isDirectory()) {
if (count < 1) {
count++;
continue;
} else {
//删除拟构目录文件
FileUtils.deleteFile(pathFile);
throw new ZipException("不符合上传要求,请检查后重试");
}
}
//输出文件路径信息
if (count != 1) {
//删除拟构目录文件
FileUtils.deleteFile(pathFile);
throw new ZipException("不符合上传要求,请检查后重试");
}
File endFile = new File(outPath);
logger.info(endFile.getPath());
returnList.add(endFile);
OutputStream out = new FileOutputStream(endFile);
byte[] buf1 = new byte[1024];
int len;
while ((len = in.read(buf1)) > 0) {
out.write(buf1, 0, len);
}
in.close();
out.close();
}
} catch (Exception e) {
throw e;
} finally {
//删除压缩包
if (null != zipFile) {
FileUtils.deleteFile(zipFile);
}
}
logger.info("******************解压完毕********************");
return returnList;
}
/**
* 压缩文件-由于out要在递归调用外,所以封装一个方法用来
* 调用ZipFiles(ZipOutputStream out,String path,File... srcFiles)
* 该压缩可以附带目录结构
*
* @param zip
* @param path
* @param srcFiles
* @throws IOException
* @author CabbageDevil
*/
public static void ZipFiles(File zip, String path, File... srcFiles) throws IOException {
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zip));
ZipFiles(out, path, srcFiles);
out.close();
System.out.println("*****************压缩完毕*******************");
}
/**
* 压缩文件-File
*
* @param out
zip文件
* @param srcFiles 被压缩源文件
* @author CabbageDevil
*/
public static void ZipFiles(ZipOutputStream out, String path, File... srcFiles) {
path = path.replaceAll("\\", "/");
if (!path.endsWith("/")) {
path += "/";
}
byte[] buf = new byte[1024];
try {
for (int i = 0; i < srcFiles.length; i++) {
if (srcFiles[i].isDirectory()) {
File[] files = srcFiles[i].listFiles();
String srcPath = srcFiles[i].getName();
srcPath = srcPath.replaceAll("\\", "/");
if (!srcPath.endsWith("/")) {
srcPath += "/";
}
out.putNextEntry(new ZipEntry(path + srcPath));
ZipFiles(out, path + srcPath, files);
} else {
FileInputStream in = new FileInputStream(srcFiles[i]);
System.out.println(path + srcFiles[i].getName());
out.putNextEntry(new ZipEntry(path + srcFiles[i].getName()));
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
out.closeEntry();
in.close();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void outputStreamToZip(byte[] bytes,String fileUrl) throws IOException {
//
ByteArrayOutputStream baos = (ByteArrayOutputStream) outputStream;
//
byte[] bytes = baos.toByteArray();
ByteArrayInputStream swapStream = new ByteArrayInputStream(bytes);
ZipInputStream zis = new ZipInputStream(swapStream);
java.util.zip.ZipEntry entry = null;
byte[] buf = new byte[1024];
int len = 0;
//此处我们需要判断是否zis流中存在条目,你可以理解为是否存在文件内容
while ((entry = zis.getNextEntry()) != null) {
//此处我们获取条目名称
String name = entry.getName();
System.out.println(name);
//我们将每一个条目进行解压,我们需要指定一个输出路径
FileOutputStream fos = new FileOutputStream(fileUrl + name);
while ((len = zis.read(buf)) != -1) {
fos.write(buf, 0, len);
}
fos.close();
}
zis.close();
}
}
异常
public class ZipException extends Exception{
public ZipException(String message) {
super( message );
}
}
最后
以上就是背后楼房为你收集整理的JAVA 解压和压缩 实战 ZIP工具类的全部内容,希望文章能够帮你解决JAVA 解压和压缩 实战 ZIP工具类所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复