用Java進行zip文件壓縮與解壓縮
可能存在的業(yè)務(wù)情況:
1、用戶上傳了壓縮包,需校驗壓縮包中的文件是否合格。
2、用戶上傳壓縮包,對壓縮包中的文件進行批量水印處理
解決思路:
1、讀取原壓縮包文件,解壓縮至臨時目錄
2、對臨時目錄中的解壓縮文件進行校驗/水印處理
3、對臨時目錄中處理過的文件進行壓縮
4、刪除臨時目錄及其下的文件
需要參考前面的校驗PDF的帖子
測試結(jié)果如下:


測試代碼:
@Test
public void testZip() {
String filePath = "D:\\pdfTest\\合格壓縮文件.zip";
// 獲取原文所在目錄
// 服務(wù)器上時,文件路徑為“/”,此處測試需要換成filePath中的“\\”
//String oldFilePath = filePath.substring(0, filePath.lastIndexOf("/"));
String oldFilePath = filePath.substring(0, filePath.lastIndexOf("\\"));
System.out.println("原文件路徑:" + oldFilePath);
// 臨時目錄,原壓縮文件解壓目錄
String destDirPath = oldFilePath + "\\tmp\\";
System.out.println("臨時路徑:" + destDirPath);
// 將原壓縮文件解壓到臨時目錄
ZipUtil.unzipFile(filePath, destDirPath);
// 臨時目錄文件對象
File destDir = new File(destDirPath);
// 獲取臨時目錄下的所有文件
File[] files = destDir.listFiles();
// 定義變量,保存校驗結(jié)果
List<Integer> list = new ArrayList<>();
// 遍歷文件,進行校驗
for (File file: files) {
String absolutePath = file.getAbsolutePath();
System.out.println(absolutePath);
int i = CheckPdfHelper.checkPdf(absolutePath);
list.add(i);
// 壓縮包中存在不合格PDF文件時
if (i != 0) {
break;
}
}
// 判斷是否包含不合格PDF文件
if (list.contains(1)) {
System.out.println("壓縮文件中包含不合格PDF文件");
// 刪除解壓縮的文件和臨時目錄
ZipUtil.deletefile(destDirPath);
// 不合格時,不生成新的壓縮包文件
return;
} else {
System.out.println("壓縮文件PDF文件均符合要求");
}
// 獲取原壓縮文件后綴
int pos = filePath.lastIndexOf('.');
String suffix = filePath.substring(pos + 1);
// 新生成壓縮文件路徑
String newFilePath = filePath.substring(0, pos) + ".PSW." + suffix;
System.out.println("新的壓縮文件路徑:" + newFilePath);
// 將檢驗成功的文件壓縮成一個新的壓縮包
ZipUtil.zipFile(newFilePath, files);
// 刪除臨時目錄
ZipUtil.deletefile(destDirPath);
}
ZipUtil工具類:
package com.alphajuns.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;
/**
* @ClassName ZipUtil
* @Description 壓縮或解壓縮zip:由于直接使用java.util.zip工具包下的類,會出現(xiàn)中文亂碼問題,所以使用ant.jar中的org.apache.tools.zip下的工具類
* @Author AlphaJunS
* @Date 2020/3/8 11:30
* @Version 1.0
*/
public class ZipUtil {
/**
* @Author AlphaJunS
* @Date 11:32 2020/3/8
* @Description
* @param zip 壓縮目的地址
* @param srcFiles 壓縮的源文件
* @return void
*/
public static void zipFile( String zip , File[] srcFiles ) {
try {
if( zip.endsWith(".zip") || zip.endsWith(".ZIP") ){
FileOutputStream fos = new FileOutputStream(new File(zip));
ZipOutputStream _zipOut = new ZipOutputStream(fos) ;
_zipOut.setEncoding("GBK");
for( File _f : srcFiles ){
handlerFile(zip , _zipOut , _f , "");
}
fos.close();
_zipOut.close();
}else{
System.out.println("target file[" + zip + "] is not .zip type file");
}
} catch (FileNotFoundException e) {
} catch (IOException e) {
}
}
/**
* @Author AlphaJunS
* @Date 11:33 2020/3/8
* @Description
* @param zip 壓縮的目的地址
* @param zipOut
* @param srcFile 被壓縮的文件信息
* @param path 在zip中的相對路徑
* @return void
*/
private static void handlerFile(String zip , ZipOutputStream zipOut , File srcFile , String path) throws IOException {
System.out.println(" begin to compression file[" + srcFile.getName() + "]");
if( !"".equals(path) && ! path.endsWith(File.separator)){
path += File.separator ;
}
if( ! srcFile.getPath().equals(zip) ){
if( srcFile.isDirectory() ){
File[] _files = srcFile.listFiles() ;
if( _files.length == 0 ){
zipOut.putNextEntry(new ZipEntry( path + srcFile.getName() + File.separator));
zipOut.closeEntry();
}else{
for( File _f : _files ){
handlerFile( zip ,zipOut , _f , path + srcFile.getName() );
}
}
}else{
InputStream _in = new FileInputStream(srcFile) ;
zipOut.putNextEntry(new ZipEntry(path + srcFile.getName()));
int len = 0 ;
byte[] _byte = new byte[1024];
while( (len = _in.read(_byte)) > 0 ){
zipOut.write(_byte, 0, len);
}
_in.close();
zipOut.closeEntry();
}
}
}
/**
* @Author AlphaJunS
* @Date 11:34 2020/3/8
* @Description 解壓縮ZIP文件,將ZIP文件里的內(nèi)容解壓到targetDIR目錄下
* @param zipPath 待解壓縮的ZIP文件名
* @param descDir 目標目錄
* @return java.util.List<java.io.File>
*/
public static List<File> unzipFile(String zipPath, String descDir) {
return unzipFile(new File(zipPath) , descDir) ;
}
/**
* @Author AlphaJunS
* @Date 11:36 2020/3/8
* @Description 對.zip文件進行解壓縮
* @param zipFile 解壓縮文件
* @param descDir 壓縮的目標地址,如:D:\\測試 或 /mnt/d/測試
* @return java.util.List<java.io.File>
*/
@SuppressWarnings("rawtypes")
public static List<File> unzipFile(File zipFile, String descDir) {
List<File> _list = new ArrayList<File>() ;
try {
ZipFile _zipFile = new ZipFile(zipFile , "GBK") ;
for( Enumeration entries = _zipFile.getEntries() ; entries.hasMoreElements() ; ){
ZipEntry entry = (ZipEntry)entries.nextElement() ;
File _file = new File(descDir + File.separator + entry.getName()) ;
if( entry.isDirectory() ){
_file.mkdirs() ;
}else{
File _parent = _file.getParentFile() ;
if( !_parent.exists() ){
_parent.mkdirs() ;
}
InputStream _in = _zipFile.getInputStream(entry);
OutputStream _out = new FileOutputStream(_file) ;
int len = 0 ;
byte[] _byte = new byte[1024];
while( (len = _in.read(_byte)) > 0){
_out.write(_byte, 0, len);
}
_in.close();
_out.flush();
_out.close();
_list.add(_file) ;
}
}
} catch (IOException e) {
}
return _list ;
}
/**
* @Author AlphaJunS
* @Date 11:36 2020/3/8
* @Description 對臨時生成的文件夾和文件夾下的文件進行刪除
* @param delpath
* @return void
*/
public static void deletefile(String delpath) {
try {
File file = new File(delpath);
if (!file.isDirectory()) {
file.delete();
} else if (file.isDirectory()) {
String[] fileList = file.list();
for (int i = 0; i < fileList.length; i++) {
File delfile = new File(delpath + File.separator + fileList[i]);
if (!delfile.isDirectory()) {
delfile.delete();
} else if (delfile.isDirectory()) {
deletefile(delpath + File.separator + fileList[i]);
}
}
file.delete();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
以上就是用Java進行zip文件壓縮與解壓縮的詳細內(nèi)容,更多關(guān)于java zip文件壓縮與解壓縮的資料請關(guān)注腳本之家其它相關(guān)文章!
- java壓縮zip文件中文亂碼問題解決方法
- java使用gzip實現(xiàn)文件解壓縮示例
- Java解壓和壓縮帶密碼的zip文件過程詳解
- Java實現(xiàn)解壓zip壓縮包的兩種方法(支持多層級)
- Java后臺實現(xiàn)瀏覽器一鍵導(dǎo)出下載zip壓縮包
- Java多文件以ZIP壓縮包導(dǎo)出的實現(xiàn)方法
- Java實現(xiàn)導(dǎo)出ZIP壓縮包的方法
- java實現(xiàn)一次性壓縮多個文件到zip中的方法示例
- Java創(chuàng)建ZIP壓縮文件的方法
- Java實現(xiàn)文件壓縮為zip和解壓zip壓縮包
- 淺談Java?Zip?壓縮及其優(yōu)化
相關(guān)文章
Java super關(guān)鍵字調(diào)用父類過程解析
這篇文章主要介紹了Java super關(guān)鍵字調(diào)用父類過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12
spring AOP實現(xiàn)@Around輸出請求參數(shù)和返回參數(shù)
這篇文章主要介紹了spring AOP實現(xiàn)@Around輸出請求參數(shù)和返回參數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02
SpringBoot2.X Devtools熱部署實現(xiàn)解析
這篇文章主要介紹了SpringBoot2.X Devtools熱部署實現(xiàn)解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08
Java中過濾器 (Filter) 和 攔截器 (Interceptor)的使用
這篇文章主要介紹了Java中過濾器 (Filter) 和 攔截器 (Interceptor)的使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
SpringBoot整合MyBatis實現(xiàn)CRUD操作項目實踐
本文主要介紹了SpringBoot整合MyBatis實現(xiàn)CRUD操作項目實踐,如何實現(xiàn)數(shù)據(jù)庫的CRUD創(chuàng)建、讀取、更新、刪除操作,具有一定的參考價值,感興趣的可以了解一下2024-02-02
Spring + Mybatis 項目實現(xiàn)動態(tài)切換數(shù)據(jù)源實例詳解
這篇文章主要介紹了Spring + Mybatis 項目實現(xiàn)動態(tài)切換數(shù)據(jù)源的相關(guān)資料,需要的朋友參考下吧2017-04-04

