日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JAVA压缩/解压ZIP/7Z文件(by Apache Commons Compress)

發布時間:2023/12/14 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JAVA压缩/解压ZIP/7Z文件(by Apache Commons Compress) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

目前手中有個項目,需要做到用戶打包圖片上傳處理的邏輯,這個時候,就需要用到一個JAVA的壓縮/解壓庫Apache Commons Compress 。

  • 從壓縮文件中逐個讀取文件(廢話,肯定從里面讀啦)。
  • 讀取文件的文件名進行業務邏輯判斷(文件名跟業務編號有關)。
  • 上傳之后返回一個信息說哪些成功、哪些失敗、哪些異常或沒有權限。

WHats Apache Commons Compress?

Apache Commons Compress,Compress是ApacheCommons提供壓縮、解壓縮文件的類庫,定義了一個用于處理ar,cpio,Unix dump,tar,zip,gzip,XZ,Pack200,bzip2、7z,arj,lzma,snappy,DEFLATE,lz4,Brotli,Zstandard,DEFLATE64和Z文件的API ,非常強大。

官網 http://commons.apache.org/proper/commons-compress/

POM.xml

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-compress --> <dependency><groupId>org.apache.commons</groupId><artifactId>commons-compress</artifactId><version>1.20</version> </dependency>

核心代碼

假設文件以及成功上傳到目標文件夾(本文不涉及上傳,只講解解壓)

ArchiveInputStream archiveInputStream = factory.createArchiveInputStream(ArchiveStreamFactory.ZIP,inputStream);
代表解壓ZIP文件,也支持一下文件:

業務代碼:

public ReturnT importImage(String filename,Integer roleId,Integer userId){List<String> resultList = new ArrayList<>(24);File archiveFile = new File(storageService.getPathString()+filename);File outputDir = new File(storageService.getPathString()+userId);// 指定文件所用字符集,這里以UTF-8為例ArchiveStreamFactory factory = new ArchiveStreamFactory("UTF-8");try {InputStream inputStream = new FileInputStream(archiveFile);//暫定解壓ZIP文件ArchiveInputStream archiveInputStream = factory.createArchiveInputStream(ArchiveStreamFactory.ZIP,inputStream);ArchiveEntry archiveEntry = null;OutputStream outputStream;File outputFile;byte[] buffer = new byte[512];int bytesRead;while ((archiveEntry = archiveInputStream.getNextEntry()) != null) {//獲取完整文件名String filenameInZip =archiveEntry.getName();//從最后一.開始切割獲取證書編號String certNumber = filenameInZip.substring(0,filenameInZip.lastIndexOf("."));Cert cert = certMapper.selectOne(new QueryWrapper<Cert>().eq("cert_number",certNumber));if(cert==null){log.info("unzip-證書不存在:{} 證書上傳者roleId{} userId:{}",certNumber,roleId,userId);resultList.add(certNumber+":證書不存在");}else if(roleId==9|| userId.equals(cert.getUserId())){log.info("unzip-證書上傳成功:{} 證書上傳者roleId{} userId:{}",certNumber,roleId,userId);//判斷文件對應的certNumber是否擁有權限outputFile = new File(outputDir, filenameInZip);if (!outputFile.getParentFile().exists()) {outputFile.getParentFile().mkdirs();}outputStream = new FileOutputStream(outputFile);// 進行數據拷貝while ((bytesRead = archiveInputStream.read(buffer)) > 0) {outputStream.write(buffer, 0, bytesRead);}outputStream.close();cert.setCertImg(userId+"/"+filenameInZip);cert.setUpdateTime(new Date());certMapper.updateById(cert);resultList.add(certNumber+":證書上傳成功");}else{log.info("unzip-權限錯誤:{} 證書上傳者roleId{} userId:{}",certNumber,roleId,userId);resultList.add(certNumber+":權限錯誤");}}} catch (Exception e) {e.printStackTrace();}return ReturnT.SUCCESS(resultList);}

效果查看

前端可以顯示什么上傳成功

上傳目錄可以看到成功的文件已經解壓,其它不需要處理的文件已經忽略。

關于ArchiveStreamFactory

關于ArchiveStreamFactory的信息,可以在一下javadoc中找到,包含解壓zip壓縮包和壓縮成zip安裝包。

#ClassInfo public class ArchiveStreamFactory extends java.lang.Object implements ArchiveStreamProvider#Description: Factory to create Archive[In|Out]putStreams from names or the first bytes of the InputStream. In order to add other implementations, you should extend ArchiveStreamFactory and override the appropriate methods (and call their implementation from super of course). ### Compressing a ZIP-File:final OutputStream out = Files.newOutputStream(output.toPath());ArchiveOutputStream os = new ArchiveStreamFactory().createArchiveOutputStream(ArchiveStreamFactory.ZIP, out);os.putArchiveEntry(new ZipArchiveEntry("testdata/test1.xml"));IOUtils.copy(Files.newInputStream(file1.toPath()), os);os.closeArchiveEntry();os.putArchiveEntry(new ZipArchiveEntry("testdata/test2.xml"));IOUtils.copy(Files.newInputStream(file2.toPath()), os);os.closeArchiveEntry();os.close();### Decompressing a ZIP-File:final InputStream is = Files.newInputStream(input.toPath());ArchiveInputStream in = new ArchiveStreamFactory().createArchiveInputStream(ArchiveStreamFactory.ZIP, is);ZipArchiveEntry entry = (ZipArchiveEntry)in.getNextEntry();OutputStream out = Files.newOutputStream(dir.toPath().resolve(entry.getName()));IOUtils.copy(in, out);out.close();in.close();

總結

以上是生活随笔為你收集整理的JAVA压缩/解压ZIP/7Z文件(by Apache Commons Compress)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。