使用ant提供的zip进行压缩和解压缩,支持中文详解编程语言

 
import java.io.BufferedInputStream; 
import java.io.BufferedOutputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.util.Enumeration; 
 
import org.apache.tools.zip.ZipEntry; 
import org.apache.tools.zip.ZipFile; 
import org.apache.tools.zip.ZipOutputStream; 
 
/** 
 * @author yangfei 
 * @since 2013-1-27 
 */ 
public class ZipUtilApache { 
 
    static final int BUFFER = 1024; 
 
    public static void zip(String destDirPath, String inputPath) 
            throws Exception { 
        File inputFile = new File(inputPath); 
        // 创建压缩文件 
        File destDir = new File(destDirPath); 
        if (!destDir.exists()) { 
            destDir.mkdir(); 
        } 
        File destFile = new File(destDir + File.separator + inputFile.getName() 
                + ".zip"); 
        // 递归压缩方法 
        ZipOutputStream out = new ZipOutputStream( 
                new FileOutputStream(destFile)); 
        // 设置压缩编码.设置为GBK后在windows下就不会乱码了,如果要放到Linux或者Unix下就不要设置了 
        out.setEncoding("GBK"); 
        zip(out, inputFile, ""); 
        System.out.println("zip done"); 
        out.close(); 
    } 
 
    private static void zip(ZipOutputStream out, File f, String base) 
            throws Exception { 
        System.out.println("Zipping   " + f.getName()); // 记录日志,开始压缩 
        if (f.isDirectory()) { // 如果是文件夹,则获取下面的所有文件 
            File[] fl = f.listFiles(); 
            if (base.length() > 0) { 
 
                out.putNextEntry(new ZipEntry(base + "/"));// 此处要将文件写到文件夹中只用在文件名前加"/"再加文件夹名 
            } 
 
            base = base.length() == 0 ? "" : base + "/"; 
            for (int i = 0; i < fl.length; i++) { 
                zip(out, fl[i], base + fl[i].getName()); 
            } 
        } else { // 如果是文件,则压缩 
            out.putNextEntry(new ZipEntry(base)); // 生成下一个压缩节点 
            FileInputStream in = new FileInputStream(f); // 读取文件内容 
            int len; 
            byte[] buf = new byte[BUFFER]; 
            while ((len = in.read(buf, 0, BUFFER)) != -1) { 
                out.write(buf, 0, len); // 写入到压缩包 
            } 
            in.close(); 
            out.closeEntry(); 
        } 
    } 
 
    /** 
     * 解压缩zip文件 
     *  
     * @param fileName 
     *            要解压的文件名 包含路径 如:"c:////test.zip" 
     * @param filePath 
     *            解压后存放文件的路径 如:"c:////temp" 
     * @throws Exception 
     */ 
    public static void unZip(String fileName, String destFilePath) 
            throws Exception { 
        ZipFile zipFile = new ZipFile(fileName, "GBK"); // 以“GBK”编码创建zip文件,用来处理winRAR压缩的文件。 
        Enumeration emu = zipFile.getEntries(); 
        while (emu.hasMoreElements()) { 
            ZipEntry entry = (ZipEntry) emu.nextElement(); 
            if (entry.isDirectory()) { 
                File dir = new File(destFilePath + entry.getName()); 
                if (!dir.exists()) { 
                    dir.mkdirs(); 
                } 
                continue; 
            } 
            BufferedInputStream bis = new BufferedInputStream(zipFile 
                    .getInputStream(entry)); 
 
            File file = new File(destFilePath + entry.getName()); 
            File parent = file.getParentFile(); 
            if (parent != null && (!parent.exists())) { 
                parent.mkdirs(); 
            } 
            FileOutputStream fos = new FileOutputStream(file); 
            BufferedOutputStream bos = new BufferedOutputStream(fos, BUFFER); 
            byte[] buf = new byte[BUFFER]; 
            int len = 0; 
            while ((len = bis.read(buf, 0, BUFFER)) != -1) { 
                fos.write(buf, 0, len); 
            } 
            bos.flush(); 
            bos.close(); 
            bis.close(); 
            System.out.println("解压文件:" + file.getName()); 
        } 
        zipFile.close(); 
    } 
}

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/10634.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论