Java解压ZIP

Java压缩、解压ZIP

package com.util;

import java.io.*;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;

public class ZIPUtil {

    public static void main(String[] args) throws Exception {
        //压缩测试
        String src = "D:\\mytest\\test";
        String dest = "D:\\mytest\\test1.zip";
        File srcFiles = new File(src);
        File destFile = new File(dest);

        File[] files = srcFiles.listFiles();
        zip(destFile, files);

        //解压测试
        src = "D:\\mytest\\test1.zip";
        String destDir = "D:\\mytest\\test2";
        File srcFile = new File(src);
        unZip(srcFile, destDir);
    }

    /**
     * 压缩<br>
     * 支持单个或者多个目录或文件<br>
     * 支持多层目录文件,保留空目录<br>
     * @param destFile 压缩结果文件
     * @param srcFiles 要压缩的文件
     */
    public static void zip(File destFile, File... srcFiles) throws Exception {
        ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(destFile));
        for (File file : srcFiles) {
            compress(zos, file, file.getName());
        }
        zos.close();
    }

    /**
     * 递归压缩
     * @param zos          zip输出流
     * @param srcFile      要压缩的文件
     * @param zipEntryName 压缩后的zip节点名
     * @throws Exception
     */
    private static void compress(ZipOutputStream zos, File srcFile, String zipEntryName) throws Exception {
        // 如果是目录,则创建目录并递归压缩子文件
        if (srcFile.isDirectory()) {
            // 添加目录
            zos.putNextEntry(new ZipEntry(zipEntryName + File.separator));
            zos.closeEntry();
            // 遍历并压缩子文件
            for (File subFile : srcFile.listFiles()) {
                String subZipEntryName = zipEntryName + File.separator + subFile.getName();
                compress(zos, subFile, subZipEntryName);
            }
        } else {
            // 如果是文件,则压缩文件
            zos.putNextEntry(new ZipEntry(zipEntryName));
            FileInputStream inputStream = new FileInputStream(srcFile);
            int len;
            byte[] buf = new byte[1024];
            while ((len = inputStream.read(buf)) != -1) {
                zos.write(buf, 0, len);
            }
            inputStream.close();
            zos.closeEntry();
        }
    }

    /**
     * 解压
     * @param srcFile 要解压的文件
     * @param destDir 解压输出目录
     */
    public static void unZip(File srcFile, String destDir) throws Exception {
        ZipFile zipFile = null;
        try {
            File file = new File(destDir);
            if (!file.getParentFile().exists()) {
                file.getParentFile().mkdirs();
            }
            // 开始解压
            zipFile = new ZipFile(srcFile);
            Enumeration<?> entries = zipFile.entries();
            while (entries.hasMoreElements()) {
                ZipEntry entry = (ZipEntry) entries.nextElement();
                // 如果是文件夹,就创建个文件夹
                if (entry.getName().endsWith("/") || entry.getName().endsWith("\\")) {
                    String dirPath = destDir + File.separator + entry.getName();
                    File dir = new File(dirPath);
                    dir.mkdirs();
                } else {
                    // 如果是文件,就先创建一个文件,然后用io流把内容copy过去
                    File targetFile = new File(destDir + File.separator + entry.getName());
                    // 保证这个文件的父文件夹必须要存在
                    if (!targetFile.getParentFile().exists()) {
                        targetFile.getParentFile().mkdirs();
                    }
                    targetFile.createNewFile();
                    // 将压缩文件内容写入到这个文件中
                    InputStream inputStream = zipFile.getInputStream(entry);
                    FileOutputStream fos = new FileOutputStream(targetFile);
                    int len;
                    byte[] buf = new byte[1024];
                    while ((len = inputStream.read(buf)) != -1) {
                        fos.write(buf, 0, len);
                    }
                    fos.close();
                    inputStream.close();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        } finally {
            if (zipFile != null) {
                try {
                    zipFile.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值