java實現將文件壓縮成zip格式


以下是將文件壓縮成zip格式的工具類(復制后可以直接使用):

 zip4j.jar包下載地址:http://www.lingala.net/zip4j/download.php

package util;
import java.io.File;  
import java.util.ArrayList;  
import java.util.Collections;  
import java.util.List;  
  
import org.apache.commons.lang3.StringUtils;  
  
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;  
  
/** 
 * ZIP壓縮文件操作工具類 
 * 支持密碼 */  
public class CompressUtil {  
      
    /** 
     * 使用給定密碼解壓指定的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 zip 指定的ZIP壓縮文件 
     * @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<File>();  
        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 src 要壓縮的指定文件 
     * @return 最終的壓縮文件存放的絕對路徑,如果為null則說明壓縮失敗. 
     */  
    public static String zip(String src) {  
        return zip(src,null);  
    }  
      
    /** 
     * 使用給定密碼壓縮指定文件或文件夾到當前目錄 
     * @param src 要壓縮的文件 
     * @param passwd 壓縮使用的密碼 
     * @return 最終的壓縮文件存放的絕對路徑,如果為null則說明壓縮失敗. 
     */  
    public static String zip(String src, String passwd) {  
        return zip(src, null, passwd);  
    }  
      
    /** 
     * 使用給定密碼壓縮指定文件或文件夾到當前目錄 
     * @param src 要壓縮的文件 
     * @param dest 壓縮文件存放路徑 
     * @param passwd 壓縮使用的密碼 
     * @return 最終的壓縮文件存放的絕對路徑,如果為null則說明壓縮失敗. 
     */  
    public static String zip(String src, String dest, String passwd) {  
        return zip(src, dest, true, passwd);  
    }  
      
    /** 
     * 使用給定密碼壓縮指定文件或文件夾到指定位置. 
     * <p> 
     * dest可傳最終壓縮文件存放的絕對路徑,也可以傳存放目錄,也可以傳null或者"".<br /> 
     * 如果傳null或者""則將壓縮文件存放在當前目錄,即跟源文件同目錄,壓縮文件名取源文件名,以.zip為后綴;<br /> 
     * 如果以路徑分隔符(File.separator)結尾,則視為目錄,壓縮文件名取源文件名,以.zip為后綴,否則視為文件名. 
     * @param src 要壓縮的文件或文件夾路徑 
     * @param dest 壓縮文件存放路徑 
     * @param isCreateDir 是否在壓縮文件里創建目錄,僅在壓縮文件為目錄時有效.<br /> 
     * 如果為false,將直接壓縮目錄下文件到壓縮文件. 
     * @param passwd 壓縮使用的密碼 
     * @return 最終的壓縮文件存放的絕對路徑,如果為null則說明壓縮失敗. 
     */  
    public static String zip(String src, String dest, boolean isCreateDir, String passwd) {  
        File srcFile = new File(src);  
        dest = buildDestinationZipFilePath(srcFile, dest);  
        ZipParameters parameters = new ZipParameters();  
        parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);           // 壓縮方式  
        parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);    // 壓縮級別  
        if (!StringUtils.isEmpty(passwd)) {  
            parameters.setEncryptFiles(true);  
            parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD); // 加密方式  
            parameters.setPassword(passwd.toCharArray());  
        }  
        try {  
            ZipFile zipFile = new ZipFile(dest);  
            if (srcFile.isDirectory()) {  
                // 如果不創建目錄的話,將直接把給定目錄下的文件壓縮到壓縮文件,即沒有目錄結構  
                if (!isCreateDir) {  
                    File [] subFiles = srcFile.listFiles();  
                    ArrayList<File> temp = new ArrayList<File>();  
                    Collections.addAll(temp, subFiles);  
                    zipFile.addFiles(temp, parameters);  
                    return dest;  
                }  
                zipFile.addFolder(srcFile, parameters);  
            } else {  
                zipFile.addFile(srcFile, parameters);  
            }  
            return dest;  
        } catch (ZipException e) {  
            e.printStackTrace();  
        }  
        return null;  
    }  
      
    /** 
     * 構建壓縮文件存放路徑,如果不存在將會創建 (注意文件路徑)
     * 傳入的可能是文件名或者目錄,也可能不傳,此方法用以轉換最終壓縮文件的存放路徑 
     * @param srcFile 源文件 
     * @param destParam 壓縮目標路徑 (包含文件名稱的路徑或者以文件分隔符結尾的路徑)
     * @return 正確的壓縮文件存放路徑 
     */  
    private static String buildDestinationZipFilePath(File srcFile,String destParam) {  
        if (StringUtils.isEmpty(destParam)) {  
            if (srcFile.isDirectory()) {  
                destParam = srcFile.getParent() + File.separator + srcFile.getName() + ".zip";  
            } else {  
                String fileName = srcFile.getName().substring(0, srcFile.getName().lastIndexOf("."));  
                destParam = srcFile.getParent() + File.separator + fileName + ".zip";  
            }  
        } else {  
            createDestDirectoryIfNecessary(destParam);  // 在指定路徑不存在的情況下將其創建出來  
            if (destParam.endsWith(File.separator)) {  
                String fileName = "";  
                if (srcFile.isDirectory()) {  
                    fileName = srcFile.getName();  
                } else {  
                    fileName = srcFile.getName().substring(0, srcFile.getName().lastIndexOf("."));  
                }  
                destParam += fileName + ".zip";  
            }  
        }  
        return destParam;  
    }  
      
    /** 
     * 在必要的情況下創建壓縮文件存放目錄,比如指定的存放路徑並沒有被創建 
     * @param destParam 指定的存放路徑,有可能該路徑並沒有被創建 
     */  
    private static void createDestDirectoryIfNecessary(String destParam) {  
        File destDir = null;  
        if (destParam.endsWith(File.separator)) {  
            destDir = new File(destParam);  
        } else {  
            destDir = new File(destParam.substring(0, destParam.lastIndexOf(File.separator)));  
        }  
        if (!destDir.exists()) {  
            destDir.mkdirs();  
        }  
    }  
  
} 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM