/***
* @Title: zipFilesAndEncrypt
* @Description: 将指定路径下的文件压缩至指定zip文件,并以指定密码加密 若密码为空,则不进行加密保护
*@paramsrcFileName 待压缩文件路径
*@paramzipFileName zip文件名
*@parampassword 加密密码
*@return*@throwsException*/
public static void zipFilesAndEncrypt(String srcFileName,String zipFileName,String password) throwsException{
ZipOutputStream outputStream= null;
InputStream inputStream= null;if(StringUtils.isEmpty(srcFileName) ||StringUtils.isEmpty(zipFileName)){throw new NullArgumentException("待压缩文件或者压缩文件名");
}try{
File srcFile= newFile(srcFileName);
File[] files= new File[0];if(srcFile.isDirectory()) {
files=srcFile.listFiles();
}else{
files= new File[1];
files[0] =srcFile;
}
outputStream= new ZipOutputStream(new FileOutputStream(newFile(zipFileName)));
ZipParameters parameters= newZipParameters();
parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);if(!StringUtils.isEmpty(password)){
parameters.setEncryptFiles(true);//Zip4j supports AES or Standard Zip Encryption (also called ZipCrypto)//If you choose to use Standard Zip Encryption, please have a look at example//as some additional steps need to be done while using ZipOutputStreams with//Standard Zip Encryption
parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES);
parameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256);
parameters.setPassword(password);
}//Now we loop through each file and read this file with an inputstream//and write it to the ZipOutputStream.
int fileNums =files.length;for (int i = 0; i < fileNums; i++) {
File file=(File)files[i];//This will initiate ZipOutputStream to include the file//with the input parameters
outputStream.putNextEntry(file,parameters);//If this file is a directory, then no further processing is required//and we close the entry (Please note that we do not close the outputstream yet)
if(file.isDirectory()) {
outputStream.closeEntry();continue;
}
inputStream= newFileInputStream(file);byte[] readBuff = new byte[4096];int readLen = -1;//Read the file content and write it to the OutputStream
while ((readLen = inputStream.read(readBuff)) != -1) {
outputStream.write(readBuff,0, readLen);
}//Once the content of the file is copied, this entry to the zip file//needs to be closed. ZipOutputStream updates necessary header information//for this file in this step
outputStream.closeEntry();
inputStream.close();
}//ZipOutputStream now writes zip header information to the zip file
outputStream.finish();
}catch(Exception e) {
log.error("文件压缩出错", e);throwe;
}finally{if (outputStream != null) {try{
outputStream.close();
}catch(IOException e) {
log.error("压缩文件输出错误", e);throwe;
}
}if (inputStream != null) {try{
inputStream.close();
}catch(IOException e) {
log.error("压缩文件错误", e);throwe;
}
}
}
}