zip解壓和壓縮 引言 介紹zip文件的概念 涉及到的Java類和包:java.util.zip https://blog.csdn.net/u012998680/article/details/126060855 壓縮文件 準備壓縮的源文件和目標zip文件的路徑 創建FileOutputStrea ...
引言
-
介紹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);
}
}