zip解压和压缩
引言
-
介绍zip文件的概念
-
涉及到的Java类和包:
java.util.zip
压缩文件
-
准备压缩的源文件和目标zip文件的路径
-
创建
FileOutputStream
和ZipOutputStream
对象 -
创建源文件的
File
和FileInputStream
对象 -
创建
ZipEntry
对象,并设置其名称为源文件的名称 -
使用
ZipOutputStream
的putNextEntry
方法将ZipEntry
对象添加到压缩文件中 -
使用循环读取源文件的内容,并使用
ZipOutputStream
的write
方法将内容写入压缩文件中 -
关闭流对象
解压缩文件
-
准备解压缩的zip文件路径和目标目录路径
-
创建目标目录的
File
对象,如果目录不存在则创建目录 -
创建
ZipInputStream
对象,使用FileInputStream
和zip文件路径作为参数 -
使用
ZipInputStream
的getNextEntry
方法获取zip文件的每个条目ZipEntry
-
循环处理每个zip条目,获取条目的名称和文件内容,并将内容写入目标目录
-
关闭流对象
-
示例代码
创建zip工具类:
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.nio.charset.Charset;
import java.util.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class ZipUtil {
// 解压并返回的key是全路径
public static Map<String, List<MultipartFile>> unzipAndConvertToMap(File file) throws IOException {
Map<String, List<MultipartFile>> map = new HashMap<>(); // 存放解压后的图片
byte[] buffer = new byte[1024];
ZipInputStream zis = new ZipInputStream(new FileInputStream(file),Charset.forName("GBK"));
try {
ZipEntry entry;
while ((entry = zis.getNextEntry()) != null) {
if (!entry.isDirectory() && isImage(entry.getName())) { // 判断当前解压的是否是图片
// 获取到全路径名称
String allFileName = entry.getName();
String[] split = allFileName.split("/");
// // 图片名称
// String imageName = split[split.length - 1];
// // 第一层文件夹名称
// String firstFile = split[0];
StringBuffer sb = new StringBuffer();
for (int i = 1; i < split.length-1; i++) {
sb.append(split[i]).append("/");
}
String folderName = sb.toString();
List<MultipartFile> imgList = map.getOrDefault(folderName, new ArrayList<>());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int len;
while ((len = zis.read(buffer)) > 0) {
baos.write(buffer, 0, len);
}
MultipartFile multipartFile = new MockMultipartFile(entry.getName(), entry.getName(), "", baos.toByteArray());
imgList.add(multipartFile);
map.put(folderName, imgList);
}
}
} finally {