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);
}
}
} finally {
