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í)祭务。
特征:
- 從Zip文件創(chuàng)建,添加怪嫌,提取义锥,更新,刪除文件
- 讀/寫密碼保護(hù)的Zip文件
- 支持AES 128/256加密
- 支持標(biāo)準(zhǔn)郵編加密
- 支持Zip64格式
- 支持存儲(無壓縮)和Deflate壓縮方法
- 從Split Zip文件創(chuàng)建或提取文件(例如:z01岩灭,z02拌倍,... zip)
- 支持Unicode文件名
- 進(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();
}
}
注釋:
- 壓縮方式
- COMP_STORE = 0;(僅打包贰拿,不壓縮)
- COMP_DEFLATE = 8;(默認(rèn))
- COMP_AES_ENC = 99; 加密壓縮
- 壓縮級別
- 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