Zip4j使用學(xué)習(xí)

Zip4j學(xué)習(xí)

之前開發(fā)過程中遇到一個需求:需要往壓縮文件的某些目錄下插入一些文件龙考。之前使用了一些方案(例如ZipOutputStream),添加原理是新建一個壓縮文件矾睦,然后拷貝所有的文件晦款,拷貝過程中添加新的文件進(jìn)去,速度比較慢枚冗。后來發(fā)現(xiàn)了Zip4j缓溅,可以選擇將文件只打包不壓縮,然后可以特別靈活的添加赁温、刪除文件坛怪。

zip4j功能比較強(qiáng)大淤齐,支持加密、解密壓縮袜匿,支持文件的添加更啄、刪除等,所以想好好學(xué)習(xí)一波居灯。

1.Zip4j介紹

zip4j官網(wǎng):http://www.lingala.net/zip4j/ 可以在"download"頁面下載官方示例進(jìn)行學(xué)習(xí)祭务。
特征:

  1. 從Zip文件創(chuàng)建,添加怪嫌,提取义锥,更新,刪除文件
  2. 讀/寫密碼保護(hù)的Zip文件
  3. 支持AES 128/256加密
  4. 支持標(biāo)準(zhǔn)郵編加密
  5. 支持Zip64格式
  6. 支持存儲(無壓縮)和Deflate壓縮方法
  7. 從Split Zip文件創(chuàng)建或提取文件(例如:z01岩灭,z02拌倍,... zip)
  8. 支持Unicode文件名
  9. 進(jìn)度監(jiān)視器

2.實(shí)例

這里只提供幾個我用到的例子。
pom文件添加

<dependency>
    <groupId>net.lingala.zip4j</groupId>
    <artifactId>zip4j</artifactId>
    <version>1.3.2</version>
</dependency>

2.1. 壓縮文件

import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.util.Zip4jConstants;
import java.io.File;

public class ZipFiles {
    
    private static void zipFile() throws ZipException {
        // 生成的壓縮文件
        ZipFile zipFile = new ZipFile("D:\\test.zip");
        ZipParameters parameters = new ZipParameters();
        // 壓縮方式
        parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
        // 壓縮級別
        parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
        // 要打包的文件夾
        File currentFile = new File("D:\\test");
        File[] fs = currentFile.listFiles();
        // 遍歷test文件夾下所有的文件噪径、文件夾
        for (File f : fs) {
            if (f.isDirectory()) {
                zipFile.addFolder(f.getPath(), parameters);
            } else {
                zipFile.addFile(f, parameters);
            }
        }
    }
    
    public static void main(String[] args) throws ZipException {
        zipFile();
    }
}

注釋:

  1. 壓縮方式
  • COMP_STORE = 0;(僅打包贰拿,不壓縮)
  • COMP_DEFLATE = 8;(默認(rèn))
  • COMP_AES_ENC = 99; 加密壓縮
  1. 壓縮級別
  • DEFLATE_LEVEL_FASTEST = 1; (速度最快,壓縮比最小)
  • DEFLATE_LEVEL_FAST = 3; (速度快熄云,壓縮比小)
  • DEFLATE_LEVEL_NORMAL = 5; (一般)
  • DEFLATE_LEVEL_MAXIMUM = 7;
  • DEFLATE_LEVEL_ULTRA = 9;

2.2.解壓文件

import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;

public class UnZipFiles {

    private static void unzip() {
        try {
            ZipFile zipFile = new ZipFile("D:\\test.zip");
            // 如果解壓需要密碼
//            if(zipFile.isEncrypted()) {
//                zipFile.setPassword("111");
//            }
            zipFile.extractAll("D:\\test");
        } catch (ZipException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        unzip();
    }
}

2.3.添加文件到壓縮文件中

import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.util.Zip4jConstants;
import java.io.File;
import java.util.ArrayList;

/**
 * 添加文件到壓縮文件中
 *
 * @author Wang Erniu
 * @date 2018/9/8 18:35
 */
public class AddFileToZip {

    public static void addFile() {
        try {
            ZipFile zipFile = new ZipFile("D:\\test.zip");
            ArrayList<File> addFiles = new ArrayList<>();
            addFiles.add(new File("D:\\addFile1.txt"));
            addFiles.add(new File("D:\\addFile2.txt"));
            ZipParameters parameters = new ZipParameters();
            parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
            parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
            // 目標(biāo)路徑
            parameters.setRootFolderInZip("ks/");
            zipFile.addFiles(addFiles, parameters);
            // 可以添加單個文件
//            zipFile.addFile(new File("D:\\addFile2.txt"),parameters);
        } catch (ZipException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        addFile();
    }
}

注釋:
發(fā)現(xiàn)一個問題膨更,這種方式添加文件時,只能添加一次缴允,再次添加會失敗荚守,沒有發(fā)現(xiàn)原因。

2.4.以流的方式添加文件

import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.util.Zip4jConstants;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * 流的方式添加文件
 *
 * @author Wang Erniu
 * @date 2018/9/8 18:43
 */
public class AddInputStreamToZip {

    public static void addFile(){
        InputStream is = null;
        try {
            ZipFile zip = new ZipFile("D:\\test.zip");
            ZipParameters para = new ZipParameters();
            para.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
            para.setFileNameInZip("ks/add.txt");
            para.setSourceExternalStream(true);
            is = new ByteArrayInputStream(new String("這是文件內(nèi)容").getBytes());
            zip.addStream(is, para);
        } catch (ZipException e) {
            e.printStackTrace();
        } finally {
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) {
        addFile();
    }
}

注釋:
這種方想比直接添加文件優(yōu)勢在于可以多次添加练般。

2.5.刪除壓縮文件中的文件

import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;

public class DeleteFromZip {

    public static void deleteFile() {
        try {
            ZipFile zipFile = new ZipFile("D:\\test.zip");
            zipFile.removeFile("ks/add");
        } catch (ZipException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        deleteFile();
    }
}

注釋:
測試發(fā)現(xiàn)不能刪除壓縮文件中的文件夾

2.6.創(chuàng)建帶密碼的壓縮文件

import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.util.Zip4jConstants;

import java.io.File;

public class ZipFileWithPwd {
    private static void zipFile() throws ZipException {
        // 生成的壓縮文件
        ZipFile zipFile = new ZipFile("D:\\test.zip");
        ZipParameters parameters = new ZipParameters();
        // 壓縮方式
        parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
        // 壓縮級別
        parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
        parameters.setEncryptFiles( true );
        parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES);
        parameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256);
        parameters.setPassword("111");
        // 要打包的文件夾
        File currentFile = new File("D:\\test");
        File[] fs = currentFile.listFiles();
        // 遍歷test文件夾下所有的文件矗漾、文件夾
        for (File f : fs) {
            if (f.isDirectory()) {
                zipFile.addFolder(f.getPath(), parameters);
            } else {
                zipFile.addFile(f, parameters);
            }
        }
    }

    public static void main(String[] args) throws ZipException {
        zipFile();
    }
}

由于時間問題,并沒有研究太多薄料,只測試了幾個基本操作敞贡。源碼地址:https://github.com/Grrui/zip4j
更多的例子,可以參考官網(wǎng)的例子摄职。
參考文章:
https://blog.csdn.net/u011165335/article/details/50496930

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末誊役,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子谷市,更是在濱河造成了極大的恐慌蛔垢,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件迫悠,死亡現(xiàn)場離奇詭異鹏漆,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門艺玲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來括蝠,“玉大人,你說我怎么就攤上這事饭聚〖删” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵若治,是天一觀的道長慨蓝。 經(jīng)常有香客問我,道長端幼,這世上最難降的妖魔是什么礼烈? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮此熬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘犀忱。我一直安慰自己扶关,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布搀庶。 她就那樣靜靜地躺著铜异,像睡著了一般。 火紅的嫁衣襯著肌膚如雪咆蒿。 梳的紋絲不亂的頭發(fā)上蚂子,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天,我揣著相機(jī)與錄音缆镣,去河邊找鬼芽突。 笑死,一個胖子當(dāng)著我的面吹牛董瞻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼钠糊,長吁一口氣:“原來是場噩夢啊……” “哼挟秤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起抄伍,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤艘刚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后截珍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體攀甚,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年岗喉,在試婚紗的時候發(fā)現(xiàn)自己被綠了秋度。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡钱床,死狀恐怖荚斯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情查牌,我是刑警寧澤事期,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站纸颜,受9級特大地震影響兽泣,放射性物質(zhì)發(fā)生泄漏唠倦。R本人自食惡果不足惜牵敷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望毛肋。 院中可真熱鬧润匙,春花似錦孕讳、人聲如沸厂财。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至嗤栓,卻和暖如春茉帅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背擂错。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工切蟋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人逾苫。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓沥阳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親晌杰。 傳聞我的和親對象是個殘疾皇子抑诸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容

  • WinRAR - 最新版本的更新 版本 5.50 1. WinRAR 和命令行 RAR 默認(rèn)使用 RAR ...
    王舒璇閱讀 2,394評論 0 2
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理边灭,服務(wù)發(fā)現(xiàn),斷路器称簿,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 之前發(fā)過一個帖子悔叽,但是那個帖子有點(diǎn)問題我就重新發(fā)一個吧娇澎,下面的源碼是我從今年開始不斷整理源碼區(qū)和其他網(wǎng)站上的安卓例...
    passiontim閱讀 21,901評論 181 334
  • 優(yōu)勢:有很強(qiáng)的覺察力 事實(shí):由于外出擱置了一周計(jì)劃,結(jié)果今天的計(jì)劃執(zhí)行的有折扣戚啥,晚上我回來溫柔而堅(jiān)定的push她行...
    cherrylih閱讀 185評論 0 0
  • 訴求無涯的荒野,相遇键痛。 別是遠(yuǎn)方不經(jīng)意拋下了你絮短, 陌生的距離讓眼圈干紅丁频。 有淚,落在心底拢驾。
    素絢閱讀 228評論 2 4