兩種方式實現壓縮文件或文件夾


今天做峰會活動候選人報名功能時,涉及一個打包下載附件的功能。

在這里記錄一下壓縮文件的實現過程,壓縮文件有多種實現方式。

這里記錄通過java本身自帶的ZipOutputStream類、或者Ant.jar下面的Zip類實現

1. Java本身自帶的類ZipOutputStream實現方式

public class ZipCompressor {

    static final int BUFFER = 8192;

    private File zipFile;

    /**
     * 創建一個壓縮實例
     * 
     * @param pathName 壓縮到的地址
     */
    public ZipCompressor(String pathName) {
        zipFile = new File(pathName);
    }

    /**
     * @Description: 執行壓縮
     * @param srcPathName 被壓縮文件
     */
    public void compress(String srcPathName) {
        File file = new File(srcPathName);
        if (!file.exists()) {
            throw new RuntimeException(srcPathName + "不存在!");
        }
        try {
            // 創建文件輸出流
            FileOutputStream fileOutputStream = new FileOutputStream(zipFile);
            CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream, new CRC32());
            ZipOutputStream out = new ZipOutputStream(cos);
            String basedir = "";
            compress(file, out, basedir);
            out.close();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * @Description: 判斷路徑是目錄還是文件
     * @param file 被壓縮文件
     * @param out 容器
     * @param basedir 路徑
     */
    private void compress(File file, ZipOutputStream out, String basedir) {
        /* 判斷是目錄還是文件 */
        if (file.isDirectory()) {
            System.out.println("壓縮:" + basedir + file.getName());
            this.compressDirectory(file, out, basedir);
        } else {
            System.out.println("壓縮:" + basedir + file.getName());
            this.compressFile(file, out, basedir);
        }
    }

    /**
     * @Description: 壓縮一個目錄
     * @param dir
     * @param out
     * @param basedir
     */
    private void compressDirectory(File dir, ZipOutputStream out, String basedir) {
        if (!dir.exists()) {
            return;
        }
        // 獲取目錄下的所有文件
        File[] files = dir.listFiles();
        for (int i = 0; i < files.length; i++) {
            /* 遞歸 */
            compress(files[i], out, basedir + dir.getName() + "/");
        }
    }

    /**
     * @Description: 壓縮一個文件
     * @param file
     * @param out
     * @param basedir
     */
    private void compressFile(File file, ZipOutputStream out, String basedir) {
        if (!file.exists()) {
            return;
        }
        try {
            // 將被壓縮文件轉化為緩沖輸入流
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
            // 創建壓縮包
            ZipEntry entry = new ZipEntry(basedir + file.getName());
            out.putNextEntry(entry);// 壓縮文件名稱
            int count;
            byte data[] = new byte[BUFFER];
            while ((count = bis.read(data, 0, BUFFER)) != -1) {
                out.write(data, 0, count);
            }
            bis.close();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static void main(String[] args) {
        ZipCompressor zipCompressor = new ZipCompressor("F:\\yswj.zip");
        zipCompressor.compress("F:\\Java\\資源及插件");
    }

}

2. 使用ant.jar下面的Zip類實現,該方式更簡單一些

public class ZipCompressorByAnt {

    private File zipFile;   
      
    public ZipCompressorByAnt(String pathName) {   
        zipFile = new File(pathName);   
    }   
    
    /**
     * @param srcPathName 壓縮目標
     */
    public void compress(String srcPathName) {
        File srcdir = new File(srcPathName);
        if (!srcdir.exists()) {
            throw new RuntimeException(srcPathName + "不存在!");   
        }
        Project prj = new Project();   
        Zip zip = new Zip();   
        zip.setProject(prj);   
        zip.setDestFile(zipFile);   
        FileSet fileSet = new FileSet();   
        fileSet.setProject(prj);   
        fileSet.setDir(srcdir);   
        //fileSet.setIncludes("**/*.java"); 包括哪些文件或文件夾 eg:zip.setIncludes("*.java");   
        //fileSet.setExcludes(...); 排除哪些文件或文件夾   
        zip.addFileset(fileSet);   
        
        zip.execute();
    }
    
    public static void main(String[] args) {
        
    }

}

 

ZipOutputStream實現方法代碼中有測試方法

 


免責聲明!

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



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