java算法 -- zip解壓,壓縮

生成壓縮文件:

package com.xidian.commmon;  

import java.io.File;  
import java.io.FileInputStream;  
import java.io.FileOutputStream;  
import java.io.OutputStream;  
import java.util.zip.ZipOutputStream;  
import org.apache.tools.zip.ZipEntry;  

/** 
 * ZIP操作工具類 
 * @說明 注意引入ant.jar文件 
 * @author mylike
 * @version 1.0 
 * @since 
 */  
public class Zip {  

    /** 
     * 壓縮文件列表到某ZIP文件 
     * @param zipFilename 要壓縮到的ZIP文件 
     * @param paths 文件列表,多參數 
     * @throws Exception 
     */  
    public static void compress(String zipFilename, String... paths)  
            throws Exception {  
        compress(new FileOutputStream(zipFilename), paths);  
    }  

    /** 
     * 壓縮文件列表到輸出流 
     * @param os 要壓縮到的流 
     * @param paths 文件列表,多參數 
     * @throws Exception 
     */  
    public static void compress(OutputStream os, String... paths)  
            throws Exception {  
        ZipOutputStream zos = new ZipOutputStream(os);  
        for (String path : paths) {  
            if (path.equals(""))  
                continue;  
            java.io.File file = new java.io.File(path);  
            if (file.exists()) {  
                if (file.isDirectory()) {  
                    zipDirectory(zos, file.getPath(), file.getName()  
                            + File.separator);  
                } else {  
                    zipFile(zos, file.getPath(), "");  
                }  
            }  
        }  
        zos.close();  
    }  

    private static void zipDirectory(ZipOutputStream zos, String dirName,  
            String basePath) throws Exception {  
        File dir = new File(dirName);  
        if (dir.exists()) {  
            File files[] = dir.listFiles();  
            if (files.length > 0) {  
                for (File file : files) {  
                    if (file.isDirectory()) {  
                        zipDirectory(zos, file.getPath(), basePath  
                                + file.getName().substring(  
                                        file.getName().lastIndexOf(  
                                                File.separator) + 1)  
                                + File.separator);  
                    } else  
                        zipFile(zos, file.getPath(), basePath);  
                }  
            } else {  
                ZipEntry ze = new ZipEntry(basePath);  
                zos.putNextEntry(ze);  
            }  
        }  
    }  

    private static void zipFile(ZipOutputStream zos, String filename,  
            String basePath) throws Exception {  
        File file = new File(filename);  
        if (file.exists()) {  
            FileInputStream fis = new FileInputStream(filename);  
            ZipEntry ze = new ZipEntry(basePath + file.getName());  
            zos.putNextEntry(ze);  
            byte[] buffer = new byte[8192];  
            int count = 0;  
            while ((count = fis.read(buffer)) > 0) {  
                zos.write(buffer, 0, count);  
            }  
            fis.close();  
        }  
    }  
}  

解壓文件:

package com.xidian.test;  

import java.io.File;  
import java.io.FileInputStream;  
import java.io.FileOutputStream;  
import java.util.ArrayList;  
import java.util.zip.ZipEntry;  
import java.util.zip.ZipInputStream;  

/** 
 * 解壓縮測試 
 * @說明  
 * @author cuisuqiang 
 * @version 1.0 
 * @since 
 */  
public class EctractZip {  

    @SuppressWarnings( { "unchecked", "static-access" })  
    public static void main(String[] args) {  
        EctractZip z = new EctractZip();  
        ArrayList<String> a = z.Ectract("C:\\a.zip", "C:\\tmp\\"); // 返回解壓縮出來的文件列表  
        for(String s : a){  
            System.out.println(s);  
        }  
    }  

    /** 
     * 解壓縮 
     * @param sZipPathFile 要解壓的文件 
     * @param sDestPath 解壓到某文件夾 
     * @return 
     */  
    @SuppressWarnings("unchecked")  
    public static ArrayList Ectract(String sZipPathFile, String sDestPath) {  
        ArrayList<String> allFileName = new ArrayList<String>();  
        try {  
            // 先指定壓縮檔的位置和檔名,建立FileInputStream對象  
            FileInputStream fins = new FileInputStream(sZipPathFile);  
            // 將fins傳入ZipInputStream中  
            ZipInputStream zins = new ZipInputStream(fins);  
            ZipEntry ze = null;  
            byte[] ch = new byte[256];  
            while ((ze = zins.getNextEntry()) != null) {  
                File zfile = new File(sDestPath + ze.getName());  
                File fpath = new File(zfile.getParentFile().getPath());  
                if (ze.isDirectory()) {  
                    if (!zfile.exists())  
                        zfile.mkdirs();  
                    zins.closeEntry();  
                } else {  
                    if (!fpath.exists())  
                        fpath.mkdirs();  
                    FileOutputStream fouts = new FileOutputStream(zfile);  
                    int i;  
                    allFileName.add(zfile.getAbsolutePath());  
                    while ((i = zins.read(ch)) != -1)  
                        fouts.write(ch, 0, i);  
                    zins.closeEntry();  
                    fouts.close();  
                }  
            }  
            fins.close();  
            zins.close();  
        } catch (Exception e) {  
            System.err.println("Extract error:" + e.getMessage());  
        }  
        return allFileName;  
    }  
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章