Java實現解析zip壓縮包並獲取文件內容
功能描述
頁面上傳一個源碼壓縮包,後端將壓縮包解壓,並獲取每個文件中的內容。
相關源碼
(1)首先定義一個與解壓文件對應的實體類。
package com.sonar.data.vo; import lombok.Data; /** * 文件解析對象 * * @author Yuanqiang.Zhang * @since 2022/7/12 */ @Data public class UnzipFileVo { /** * 類型:0-文件夾;1-文件 */ private Integer type; /** * 文件路徑(如:src/main/java/com/zyq/entity/User.java) */ private String path; /** * 文件內容 */ private String content; }
(2)接下來就是解壓的工具類瞭。
package com.sonar.data.utils.business; import com.sonar.data.vo.UnzipFileVo; import org.springframework.web.multipart.MultipartFile; import java.io.*; import java.util.*; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; /** * 解析文件工具類 * * @author Yuanqiang.Zhang * @since 2022/7/12 */ @SuppressWarnings("unused") public class UnZipUtils { public static int BYTE_LEN = 10240; /** * 本地文件解壓 * * @param file 具體文件 * @return 解壓後的文件列表 */ public static List<UnzipFileVo> unzip(File file) { if (Objects.isNull(file) || !file.exists()) { return Collections.emptyList(); } ZipFile zip = null; try { zip = new ZipFile(file); } catch (IOException e) { e.printStackTrace(); } if (Objects.isNull(zip)) { return Collections.emptyList(); } Enumeration<? extends ZipEntry> entries = zip.entries(); List<UnzipFileVo> vos = new ArrayList<>(); while (entries.hasMoreElements()) { ZipEntry entry = entries.nextElement(); String path = entry.getName(); UnzipFileVo vo = new UnzipFileVo(); vo.setPath(path); // 解析文件夾 boolean directory = entry.isDirectory(); if (directory) { vo.setType(0); vos.add(vo); continue; } // 解析文件 vo.setType(1); StringBuilder sb = new StringBuilder(); try (InputStream in = zip.getInputStream(entry); InputStreamReader inputStreamReader = new InputStreamReader(in); BufferedReader reader = new BufferedReader(inputStreamReader)) { String line; while ((line = reader.readLine()) != null) { sb.append(line).append("\n"); } } catch (IOException e) { e.printStackTrace(); } vo.setContent(sb.toString()); vos.add(vo); } if (Objects.nonNull(zip)) { try { zip.close(); } catch (IOException e) { e.printStackTrace(); } } return vos; } /** * 上傳文件解壓 * * @param multipartFile 上傳文件 * @return 解壓後的文件列表 */ public static List<UnzipFileVo> unzip(MultipartFile multipartFile) { File file = getFile(multipartFile); if (Objects.isNull(file)) { return Collections.emptyList(); } List<UnzipFileVo> vos = unzip(file); if (file.exists()) { boolean delete = file.delete(); if (delete) { System.out.println(file.getName() + " 臨時文件刪除成功!"); } else { System.out.println(file.getName() + " 臨時文件刪除失敗!"); } } return vos; } /** * MultipartFile 轉 File * * @param multipartFile 上傳文件 * @return 本地文件 */ private static File getFile(MultipartFile multipartFile) { String fileName = System.currentTimeMillis() + "_" + multipartFile.getOriginalFilename(); File file = new File("D://" + fileName); int len; try (OutputStream os = new FileOutputStream(file); InputStream in = multipartFile.getInputStream()) { byte[] buffer = new byte[BYTE_LEN]; while ((len = in.read(buffer, 0, BYTE_LEN)) != -1) { os.write(buffer, 0, len); } } catch (IOException e) { e.printStackTrace(); return null; } return file; } }
調用說明
工具類中提供瞭兩個解壓的方式:
方式一:本地文件 File 進行解壓。
方式二:上傳文件 MultipartFile 進行解壓。
package com.sonar.data.controller; import com.sonar.data.utils.business.UnZipUtils; import com.sonar.data.vo.UnzipFileVo; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.util.List; /** * @author Yuanqiang.Zhang * @since 2022/7/8 */ @RestController @RequestMapping("/test") public class TestController { /** * 上傳文件解壓(示例) */ @PostMapping("/import") public List<UnzipFileVo> importTest(@RequestPart("file") MultipartFile mFile) { return UnZipUtils.unzip(mFile); } /** * 本地文件解壓(示例) */ public static void main(String[] args) { File file = new File("src.zip"); boolean delete = file.delete(); System.out.println(delete); } }
測試效果
我們以上傳壓縮包解析為例,通過 Postman 進行接口測試,解析的結果如下。
以上就是Java實現解析zip壓縮包並獲取文件內容的詳細內容,更多關於Java解析zip壓縮包的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- java中MultipartFile互轉File的方法
- springboot多文件上傳實現使用postman測試多文件上傳接口
- spring boot實現文件上傳
- springboot文件上傳保存路徑的問題
- 使用Springboot整合GridFS實現文件操作