亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

ZIP4j 壓縮與解壓的實例詳解

2024-07-13 10:12:57
字體:
來源:轉載
供稿:網友

ZIP4j 壓縮與解壓的實例詳解

使用的jar包:zip4j_1.3.2.jar

基本功能:

針對ZIP壓縮文件創建、添加、分卷、更新和移除文件
(讀寫有密碼保護的Zip文件)
(支持AES 128/256算法加密)
(支持標準Zip算法加密)
(支持zip64格式)
(支持Store(僅打包,默認不壓縮,不過可以手動設置大小)和Deflate壓縮方法
(針對分塊zip文件創建和抽出文件)
(支持編碼)
(進度監控)

壓縮方式(3種):

static final int COMP_STORE = 0;(僅打包,不壓縮) (對應好壓的存儲) static final int COMP_DEFLATE = 8;(默認) (對應好壓的標準) static final int COMP_AES_ENC = 99;

壓縮級別有5種:(默認0不壓縮)級別跟好壓軟件是對應的;

static final int DEFLATE_LEVEL_FASTEST = 1; static final int DEFLATE_LEVEL_FAST = 3; static final int DEFLATE_LEVEL_NORMAL = 5; static final int DEFLATE_LEVEL_MAXIMUM = 7; static final int DEFLATE_LEVEL_ULTRA = 9; 

加密方式:

static final int ENC_NO_ENCRYPTION = -1;(默認,沒有加密方法,如果采用此字段,會報錯”沒有提供加密算法”) static final int ENC_METHOD_STANDARD = 0; static final int ENC_METHOD_AES = 99; 

AES Key Strength:

(默認-1,也就是ENC_NO_ENCRYPTION) static final int AES_STRENGTH_128 = 0x01; static final int AES_STRENGTH_192 = 0x02; static final int AES_STRENGTH_256 = 0x03;

從構造方法可以默認情況:

compressionMethod = Zip4jConstants.COMP_DEFLATE; encryptFiles = false;//不設密碼 readHiddenFiles = true;//可見 encryptionMethod = Zip4jConstants.ENC_NO_ENCRYPTION;//加密方式不加密 aesKeyStrength = -1;// includeRootFolder = true;// timeZone = TimeZone.getDefault();//

發現的現象:

在采取默認壓縮時:

1.如果此壓縮文件已經存在,那么壓縮后,相同的文件會替換(有密碼,密碼被替換),原來不同的文件會繼續保留,而且文件的時間還是第一次壓縮的時間;如果想完全覆蓋,那么需要判斷此壓縮文件存不存在,存在就刪除;

2.假如a文件加密生成了a.zip,此時如果再把其他的文件b也加密,然后生成同樣的a.zip,那么a.zip里面的文件a,b將會有各自的密碼。需要分別輸入對應密碼解壓,無形實現了對單個文件的單個加密,但是這樣解壓可能會損壞文件(個人不建議這樣做)

3.如果不設置壓縮級別,默認級別為0(不壓縮),這樣生成的zip包跟原來文件的大小差不多,另外如果壓縮方式設置成了Zip4jConstants.COMP_STORE(0)那么也是僅僅打個包;

4.如果設置了中文密碼,用好壓解壓會提示密碼錯誤(無法解壓),用ZIP4j解壓的話,正常;也就說,對于中文密碼,解壓軟件與zip4j是不能相互解壓的,原因還不清楚,請大神說說;

下面先看壓縮文件夾: (author:余紹陽,qq:279907389)

 //壓縮單個文件  @Test  public void dozip1() throws ZipException {  ZipFile zip=new ZipFile("D://壓縮//test.zip");   //需要判斷壓縮父路徑是否存在  File file=zip.getFile();  if (!file.getParentFile().exists()) {    file.getParentFile().mkdirs();  }  //設置參數  ZipParameters para=new ZipParameters();  //設置壓縮方式,默認是COMP_DEFLATEpara.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);  //設置壓縮級別,默認為0(即不壓縮)  para.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);  //設置壓縮密碼(至少3步)  //設置加密文件  para.setEncryptFiles(true);  //設置加密方式(必須要有加密算法)para.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);  para.setPassword("test111");  File srcFile=new File("src//com//學習路線.png");  zip.addFile(srcFile, para);  System.out.println("壓縮成功!");  }  //壓縮多個文件  @Test  public void dozip2() throws ZipException {  ZipFile zip=new ZipFile("D://壓縮//test.zip");  //要緊跟設置編碼  zip.setFileNameCharset("GBK");  ArrayList<File> list=new ArrayList<>();  list.add(new File("src//com//壓縮解壓//abc.txt"));  list.add(new File("src//com//壓縮解壓//abcUTF-8.txt"));  list.add(new File("src//com//壓縮解壓//解壓之后.txt"));  ZipParameters para=new ZipParameters();para.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);  para.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);  //設置密碼:  para.setEncryptFiles(true);  //設置AES加密方式  para.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES);  //必須設置長度  para.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256);   para.setPassword("111");  zip.addFiles(list, para);  System.out.println("壓縮成功!");  }  //壓縮文件夾  @Test  public void dozip3() throws ZipException {  ZipFile zip=new ZipFile("D://壓縮//test.zip");   File file=zip.getFile();  if (!file.getParentFile().exists()) {    file.getParentFile().mkdirs();  }  //為了不被原有文件干擾,保證每次重新生成  if (file.exists()) {    file.delete();  }  ZipParameters para=new ZipParameters();  //設置壓縮級別,壓縮方法默認  para.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);  zip.addFolder("E://測試壓縮", para);  System.out.println("壓縮完成!");

解壓

1.如果是用軟件壓縮(GBK)的,用zip4j解壓時需要設置”GBK”

注意設置要緊接ZipFile設置,否則編碼設置會失效;

ZipFile zipFile = new ZipFile(“D:/壓縮/test.zip”); zip.setFileNameCharset(“GBK”);

另外:在解壓之后,如果再次解壓,如果有新的文件會添加進去,相同的文件會覆蓋;不同編碼格式的會保留;

2.zip4j是支持中文密碼的,但是如果是好壓或者winRAR壓縮并且設置中文密碼,則使用zip4j解壓會提示密碼錯誤;
也就是說,用好壓設置中文密碼,只能用好壓或者winRAR等軟件解壓;而使用zip4j設置的中文密碼,好壓或winRAR也不能解壓,只能用自帶的zip4j解壓; 原因不清

3.密碼2種設置方式:

a.para.setEncryptFiles(true);

//沒有使用AES,那么就不需要AesKeyStrength para.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD) para.setPassword(“111”);

b.para.setEncryptFiles(true);

para.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES); //如果設置AES加密,那么必須指定AesKeyStrength parameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256); para.setPassword(“111”);

c.如果para.setEncryptFiles(false);那么密碼將會失效

 // 解壓方法1  public void Unzip4j(String zipFile) throws ZipException {  long startTime = System.currentTimeMillis();  //第一時間設置編碼格式  zip.setFileNameCharset("GBK");  //用自帶的方法檢測一下zip文件是否合法,包括文件是否存在、是否為zip文件、是否被損壞等    if (!zip.isValidZipFile()) {    throw new ZipException("文件不合法或不存在");  }  checkEncrypted(zip);  // 跟java自帶相比,這里文件路徑會自動生成,不用判斷  zip.extractAll("D://壓縮//test1");  System.out.println("解壓成功!");  long endTime = System.currentTimeMillis();  System.out.println("耗時:" + (endTime - startTime) + "ms");  } // 解壓方法2   public void Unzip4j1(String zipFile) throws ZipException {  long startTime = System.currentTimeMillis();  ZipFile zipFile2 = new ZipFile(zipFile);   //設置編碼格式  zipFile2.setFileNameCharset("GBK");  if (!zipFile2.isValidZipFile()) {    throw new ZipException("文件不合法或不存在");  }  //檢查是否需要密碼  checkEncrypted(zipFile2);  List<FileHeader> fileHeaderList = zipFile2.getFileHeaders();   for (int i = 0; i < fileHeaderList.size(); i++) {     FileHeader fileHeader = fileHeaderList.get(i);     zipFile2.extractFile(fileHeader, "D://壓縮//test");   }   System.out.println("解壓成功!");  long endTime = System.currentTimeMillis();  System.out.println("耗時:" + (endTime - startTime) + "ms");  }  //檢測密碼  private void checkEncrypted(ZipFile zip) throws ZipException {  Scanner in=new Scanner(System.in);  if (zip.isEncrypted()) {    System.out.println("文件"+zip.getFile().getName()+"有密碼!");    System.out.println("請輸入密碼:");    zip.setPassword(in.next().trim());  }  in.close();  }

其他功能

1.添加:是往zip文件添加非zip文件

在添加文件時,發現只能添加一次,再次添加報錯:Expected central directory entry not found (#1),原因還不知道,55
另外,如果要添加的zip文件不存在,那么將會創建一個zip文件,再添加文件;如果要添加的a.txt文件不存在,則報錯”沒有找到文件”

2.分卷:是壓縮的時候進行,可針對帶個文件或者文件夾 ,分卷后每份壓縮文件大小至少64k(65536byte) 如果在對文件(文件夾)分卷壓縮前,其已經壓縮了,那么將會分卷報錯! 那么如何解壓呢?對任意一個分卷壓縮文件解壓即可全部解壓;

3.預覽壓縮文件信息

4.刪除功能在下一篇展示,這個在zip文件刪除指定文件夾有一種非常巧妙的方法(非常規思路),不需要遞歸;

代碼如下:

public static void addFile(String srczipFile, String addfile)    throws Exception {  ZipFile zip = new ZipFile(srczipFile);  ZipParameters para = new ZipParameters();  // 封裝待添加文件  FileInputStream fis = new FileInputStream(addfile);  String fileName = new File(addfile).getName();  System.out.println(fileName);  // 這里可以設置文件夾,會自動在壓縮文件中創建這些文件夾  // String Folder="1//2//";  // para.setFileNameInZip(Folder+fileName);  para.setFileNameInZip(fileName);  // 資源擴展  para.setSourceExternalStream(true);  // 添加文件  zip.addStream(fis, para);  fis.close();  System.out.println("添加成功!");  }
// 分卷,將幾個文件進行分卷壓縮,一個單位64k  public static void zipTOSplit(String destZipFile, int unit)    throws ZipException {  ZipFile zip = new ZipFile(destZipFile);  ArrayList<File> list = new ArrayList<File>();  list.add(new File("src//com//壓縮解壓//abc.txt"));  list.add(new File("src//com//壓縮解壓//abcUTF-8.txt"));  list.add(new File("src//com//cbzk//壓縮解壓//解壓之后.txt"));  ZipParameters para = new ZipParameters();  para.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_FAST);  // 創建分卷  zip.createZipFile(list, para, true, unit * 65536);  System.out.println("分卷成功!");  }
 // 將文件夾進行分卷壓縮  public static void zipTOSplit(String destZipFile, String srcFolder, int unit)    throws ZipException {  ZipFile zip = new ZipFile(destZipFile);  ZipParameters para = new ZipParameters();  // 默認COMP_DEFLATEpara.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);para.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);  // 分卷壓縮文件夾到指定壓縮位置  zip.createZipFileFromFolder(srcFolder, para, true, unit * 65536);//粗略的算一下分成多少份,獲取的大小比實際的大點(一般是準確的)  int partsize=(int)zipInfo(destZipFile)/(unit*64); //65536byte=64kb  System.out.println("分割成功!總共分割成了"+(partsize+1)+"個文件!");  } // 預覽壓縮文件信息  public static double zipInfo(String zipFile) throws ZipException {  ZipFile zip = new ZipFile(zipFile);  zip.setFileNameCharset("GBK");  List<FileHeader> list = zip.getFileHeaders();    long zipCompressedSize=0;  for(FileHeader head:list){    zipCompressedSize+=head.getCompressedSize();//   System.out.println(zipFile+"文件相關信息如下:");//   System.out.println("Name: "+head.getFileName());//   System.out.println("Compressed Size:"+(head.getCompressedSize()/1.0/1024)+"kb");//   System.out.println("Uncompressed Size:"+(head.getUncompressedSize()/1.0/1024)+"kb");//   System.out.println("CRC32:"+head.getCrc32());//   System.out.println("*************************************");  }  double size=zipCompressedSize/1.0/1024;//轉換為kb  return size;  }

如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

 

注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩在线视频国产| 日韩美女视频在线观看| 国产精欧美一区二区三区| 欧美日韩国产一区二区| 欧美午夜宅男影院在线观看| 国产一区二区三区18| 日韩亚洲精品视频| 国模极品一区二区三区| 久久这里只有精品视频首页| 成人伊人精品色xxxx视频| 亚洲高清久久网| 欧美专区日韩视频| 久久久久久国产免费| 韩国三级日本三级少妇99| 日韩大陆欧美高清视频区| 亚洲精品视频播放| 91久久精品在线| 日韩高清免费在线| 欧美床上激情在线观看| 久久精品久久久久久国产 免费| 九九热最新视频//这里只有精品| 欧美与欧洲交xxxx免费观看| 亚洲免费伊人电影在线观看av| 久久av在线播放| 日韩av影片在线观看| 国产成人精品在线播放| 在线成人免费网站| 福利一区福利二区微拍刺激| 91理论片午午论夜理片久久| 国产精品精品视频一区二区三区| 久久亚洲春色中文字幕| 国产欧洲精品视频| 国产va免费精品高清在线观看| 国产日韩欧美在线播放| 91视频免费在线| 亚洲女人天堂成人av在线| 成人国产在线视频| 日韩免费在线看| 538国产精品一区二区在线| 久久综合久中文字幕青草| 欧美亚洲免费电影| 人九九综合九九宗合| 成人激情视频在线播放| 日韩精品999| 成人av资源在线播放| 日韩免费中文字幕| 麻豆国产精品va在线观看不卡| 亚洲最大的成人网| 精品国产乱码久久久久久虫虫漫画| 欧美做受高潮电影o| 欧美大肥婆大肥bbbbb| 国产精品美女av| 国产精品91在线观看| 国产精品久久久久久av福利软件| 久久久久久久久爱| 成人精品久久一区二区三区| 亚洲欧美成人一区二区在线电影| 国产成人aa精品一区在线播放| 成人黄色在线观看| 自拍偷拍亚洲在线| 国产精品久久久久免费a∨| 日韩欧美主播在线| 日韩电影在线观看永久视频免费网站| 精品少妇一区二区30p| 国产精欧美一区二区三区| 九九精品视频在线| 日韩电影中文字幕一区| 欧美性xxxx极品高清hd直播| 中文字幕av一区| 国产精品久久久av久久久| 裸体女人亚洲精品一区| 亚洲精品aⅴ中文字幕乱码| 国产不卡av在线| 亚洲第一福利网| 美女视频黄免费的亚洲男人天堂| 国产精品永久在线| 91视频免费在线| 亚洲精品白浆高清久久久久久| 欧美一级片免费在线| 日韩精品日韩在线观看| 国产日本欧美一区二区三区在线| 青青久久aⅴ北条麻妃| 国内精品久久久久久影视8| 色综合天天综合网国产成人网| 欧美理论电影在线播放| 久久精品夜夜夜夜夜久久| 久久精品国产96久久久香蕉| 精品中文字幕久久久久久| 欧美精品一区在线播放| 久久人人爽人人爽人人片av高请| 国产啪精品视频| 91久久精品久久国产性色也91| 国产精品久久久久久一区二区| 日韩欧美亚洲一二三区| 中日韩美女免费视频网址在线观看| 日韩精品免费综合视频在线播放| 亚洲视频综合网| 亚洲一区制服诱惑| 国产成人av网址| 亚洲精品在线不卡| 欧美最顶级丰满的aⅴ艳星| 久久久久日韩精品久久久男男| 欧美日韩免费在线| 国产精品专区h在线观看| 欧美亚州一区二区三区| 国产精品96久久久久久| 粉嫩av一区二区三区免费野| 九色精品免费永久在线| 欧美成人在线网站| 91精品视频播放| 亚洲午夜av久久乱码| 日韩少妇与小伙激情| 福利视频一区二区| 在线不卡国产精品| 日韩av影片在线观看| 九九久久国产精品| 国产精品永久免费| 日本亚洲精品在线观看| 久久久久www| 韩国美女主播一区| 亚洲精选在线观看| 国产精品女人网站| 精品久久久久久亚洲国产300| 亚洲成avwww人| 正在播放国产一区| 欧美另类高清videos| www.日韩av.com| 日韩精品视频免费专区在线播放| 伊人男人综合视频网| 久久精品视频va| 亚洲va欧美va国产综合剧情| 亚洲精品一区中文字幕乱码| 久久久亚洲成人| 97超级碰碰人国产在线观看| 久久亚洲电影天堂| 亚洲欧美日韩网| 91精品久久久久久久久久久久久久| 91天堂在线视频| 日韩av日韩在线观看| 国产成人高清激情视频在线观看| 美女啪啪无遮挡免费久久网站| 国产精品www色诱视频| 国产精品男女猛烈高潮激情| 国产亚洲欧美视频| 国产成人啪精品视频免费网| 国产91精品青草社区| 亚洲最大成人网色| 亚洲欧美中文日韩v在线观看| 精品国产欧美一区二区三区成人| 国产精品久久久久久久久久新婚| 亚洲国产一区二区三区在线观看| 久久久久久久久国产精品| 欧美极品少妇xxxxⅹ裸体艺术| 亚洲第一中文字幕在线观看| 深夜成人在线观看| 国产精品一二三视频| 一区二区三区四区在线观看视频| 亚洲精品国精品久久99热一| 日韩av大片免费看| 亚洲精品久久久久久久久久久久久| 国产成人一区二| 欧美网站在线观看| 国产精品永久免费观看| 欧美激情免费视频|