123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- package com.yihu.ehr.util.compress;
- import com.yihu.ehr.util.operator.StringUtil;
- import net.lingala.zip4j.core.ZipFile;
- import net.lingala.zip4j.exception.ZipException;
- import net.lingala.zip4j.model.FileHeader;
- import net.lingala.zip4j.model.ZipParameters;
- import net.lingala.zip4j.util.Zip4jConstants;
- import java.io.File;
- import java.util.ArrayList;
- import java.util.List;
- /**
- * 文件压缩辅助类
- *
- * @created Air 2015/5/26.
- */
- public class Zipper {
- /**
- * 使用给定密码解压指定的ZIP压缩文件到指定目录
- * <p>
- * 如果指定目录不存在,可以自动创建,不合法的路径将导致异常被抛出
- *
- * @param zip 指定的ZIP压缩文件
- * @param dest 解压目录
- * @param passwd ZIP文件的密码
- * @return 解压后文件数组
- * @throws ZipException 压缩文件有损坏或者解压缩失败抛出
- */
- public static File[] unzip(String zip, String dest, String passwd) throws ZipException {
- File zipFile = new File(zip);
- return unzip(zipFile, dest, passwd);
- }
- /**
- * 使用给定密码解压指定的ZIP压缩文件到当前目录
- *
- * @param zip 指定的ZIP压缩文件
- * @param passwd ZIP文件的密码
- * @return 解压后文件数组
- * @throws ZipException 压缩文件有损坏或者解压缩失败抛出
- */
- public static File[] unzip(String zip, String passwd) throws ZipException {
- File zipFile = new File(zip);
- File parentDir = zipFile.getParentFile();
- return unzip(zipFile, parentDir.getAbsolutePath(), passwd);
- }
- /**
- * 使用给定密码解压指定的ZIP压缩文件到指定目录
- * <p>
- * 如果指定目录不存在,可以自动创建,不合法的路径将导致异常被抛出
- *
- * @param dest 解压目录
- * @param passwd ZIP文件的密码
- * @return 解压后文件数组
- * @throws ZipException 压缩文件有损坏或者解压缩失败抛出
- */
- public static File[] unzip(File zipFile, String dest, String passwd) throws ZipException {
- ZipFile zFile = new ZipFile(zipFile);
- zFile.setFileNameCharset("GBK");
- if (!zFile.isValidZipFile()) {
- throw new ZipException("压缩文件不合法,可能被损坏.");
- }
- File destDir = new File(dest);
- if (destDir.isDirectory() && !destDir.exists()) {
- destDir.mkdir();
- }
- if (zFile.isEncrypted()) {
- zFile.setPassword(passwd.toCharArray());
- }
- zFile.extractAll(dest);
- List<FileHeader> headerList = zFile.getFileHeaders();
- List<File> extractedFileList = new ArrayList<>();
- for (FileHeader fileHeader : headerList) {
- if (!fileHeader.isDirectory()) {
- extractedFileList.add(new File(destDir, fileHeader.getFileName()));
- }
- }
- File[] extractedFiles = new File[extractedFileList.size()];
- extractedFileList.toArray(extractedFiles);
- return extractedFiles;
- }
- /**
- * @param unzipFile 需要压缩的文件(文件夹)
- * @param zipFileName 压缩后的文件名
- * @return 成功-File 失败-null
- * @throws ZipException
- */
- public File zipFile(File unzipFile, String zipFileName) throws ZipException {
- return zipFile(unzipFile, zipFileName, null);
- }
- /**
- * @param unzipFile 需要压缩的文件(文件夹)
- * @param zipFileName 压缩后的文件名
- * @param pwd 压缩密码
- * @return 成功-File 失败-null
- * @throws ZipException 2015.09.15 airhead modify 压缩文件为文件夹时,压缩从子目录开始,忽略当前目录
- */
- public File zipFile(File unzipFile, String zipFileName, String pwd) throws ZipException {
- //文件不存在时不压缩
- if (!unzipFile.exists()) {
- return null;
- }
- ZipParameters parameters = new ZipParameters();
- parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
- parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
- if (!StringUtil.isEmpty(pwd)) {
- parameters.setEncryptFiles(true);
- parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);
- parameters.setPassword(pwd.toCharArray());
- }
- File file = new File(zipFileName);
- if (!file.exists()) {
- file.getParentFile().mkdirs();
- }
- ZipFile zipFile = new ZipFile(zipFileName);
- if (unzipFile.isDirectory()) {
- // zipFile.addFolder(unzipFile, parameters);
- File[] files = unzipFile.listFiles();
- for (int i = 0; i < files.length; i++) {
- if (files[i].isDirectory()) {
- zipFile.addFolder(files[i], parameters);
- } else {
- zipFile.addFile(files[i], parameters);
- }
- }
- } else {
- zipFile.addFile(unzipFile, parameters);
- }
- return new File(zipFileName);
- }
- /**
- * @param zipFile 需要解压的文件名
- * @param unzipDirectory 解压文件路径
- * @return 成功-File 失败-null
- * @throws ZipException
- */
- public static File unzipFile(File zipFile, String unzipDirectory) throws ZipException {
- return unzipFile(zipFile, unzipDirectory, null);
- }
- /**
- * @param zipFile 需要解压的文件名
- * @param unzipDirectory 解压文件路径
- * @param pwd 解压密码
- * @return 成功-File 失败-null
- * @throws ZipException
- */
- public static File unzipFile(File zipFile, String unzipDirectory, String pwd) throws ZipException {
- ZipFile zFile = new ZipFile(zipFile);
- zFile.setFileNameCharset("GBK");
- if (!zFile.isValidZipFile()) {
- throw new ZipException("无效的压缩文件.");
- }
- if (zFile.isEncrypted()) {
- zFile.setPassword(pwd.toCharArray());
- }
- zFile.extractAll(unzipDirectory);
- return new File(unzipDirectory);
- }
- }
|