背景
常我们再开发过程中,无论是Android 客户端程序还是桌面程序,有可能涉及到文件的上传和下载,多文件时通常做zip压缩处理,将多个文件压缩为一个zip包,方便传输,另外,客户端内也可能会涉及到一些资源的下载,这些资源通常都以zip的方式存放在服务器上,客户端可以在合适的时候将zip文件下载,然后解压资源。下面了解一下使用Zip4j框架来压缩和解压处理文件。
Zip4j
官网:http://www.lingala.net/zip4j/index.php
可以下载最新的jar (好像下载下来是空的),
下面是我用最新的源码打的jar,你也可以下载这个jar文件,https://download.csdn.net/download/lindroid/10768400
使用
下面是封装的一个压缩的工具类, 可以对zip包设置密码,当然你也可以传个null, 不设置密码;
public class ZipUtil {
/**
* 对文件列表压缩加密
* @param srcfile
* @param destZipFile
* @param password
* @return
*/
public static File doZipFilesWithPassword(File[] srcfile, String destZipFile, String password) {
if (srcfile == null || srcfile.length == 0) {
return null;
}
ZipParameters parameters = new ZipParameters();
// 压缩方式
parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
// 压缩级别
parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
// 加密方式
if (!TextUtils.isEmpty(password)) {
parameters.setEncryptFiles(true);
parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);
parameters.setPassword(password);
}
ArrayList<File> existFileList = new ArrayList<File>();
for (int i = 0; i < srcfile.length; i++) {
if (srcfile[i] != null) {
existFileList.add(srcfile[i]);
}
}
try {
ZipFile zipFile = new ZipFile(destZipFile);
zipFile.addFiles(existFileList, parameters);
return zipFile.getFile();
} catch (ZipException e) {
e.printStackTrace();
return null;
}
}
/**
* 对文件夹加密
* @param folder
* @param destZipFile
* @param password
* @return
*/
public static File doZipFilesWithPassword(File folder, String destZipFile, String password) {
if (!folder.exists()) {
return null;
}
ZipParameters parameters = new ZipParameters();
// 压缩方式
parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
// 压缩级别
parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
// 加密方式
if (!TextUtils.isEmpty(password)) {
parameters.setEncryptFiles(true);//
parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);
parameters.setPassword(password);
}
try {
ZipFile zipFile = new ZipFile(destZipFile);
zipFile.addFolder(folder, parameters);
return zipFile.getFile();
} catch (ZipException e) {
e.printStackTrace();
return null;
}
}
/**
* 单文件压缩并加密
* @param file 要压缩的zip文件
* @param destZipFile zip保存路径
* @param password 密码 可以为null
* @return
*/
public static File doZipSingleFileWithPassword(File file, String destZipFile, String password) {
if (!file.exists()) {
return null;
}
ZipParameters parameters = new ZipParameters();
// 压缩方式
parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
// 压缩级别
parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
// 加密方式
if (!TextUtils.isEmpty(password)) {
parameters.setEncryptFiles(true);//
parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);
parameters.setPassword(password);
}
try {
ZipFile zipFile = new ZipFile(destZipFile);
zipFile.addFile(file,parameters);
return zipFile.getFile();
} catch (ZipException e) {
e.printStackTrace();
return null;
}
}
/**
* 解压文件
File:目标zip文件
password:密码,如果没有可以传null
path:解压到的目录路径
*/
public static boolean unZip(File file,String password,String path) {
boolean res = false;
try {
ZipFile zipFile = new ZipFile(file);
if (zipFile.isEncrypted()) {
if(password != null && !password.isEmpty()) {
zipFile.setPassword(password);
}
}
zipFile.extractAll(path);
res = true;
} catch (ZipException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return res;
}
}
工具类中的几个方法基本都是对zip4j 提供的api的简单封装,主要是ZipFile类和ZipParameters 类 , 可以参考继续封装一些更简单的方法出来。