zip解压和压缩,
分享于 点击 32413 次 点评:266
zip解压和压缩,
引言
-
介绍zip文件的概念
-
涉及到的Java类和包:java.util.zip
-
https://blog.csdn.net/u012998680/article/details/126060855
压缩文件
-
准备压缩的源文件和目标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);
介绍zip文件的概念
涉及到的Java类和包:java.util.zip
https://blog.csdn.net/u012998680/article/details/126060855
准备压缩的源文件和目标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);