使用ZipEntry压缩与解压缩

使用ZipEntry压缩与解压缩importjava.io.BufferedInputStream;importjava.io.BufferedOutputStream;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io

使用ZipEntry压缩与解压缩"

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.zip.CRC32;
import java.util.zip.CheckedOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;

import org.apache.log4j.Logger;

public class ZipUtil { 
   
    private static Logger logger = Logger.getLogger(ZipUtil.class);
    /** * 递归压缩文件夹 * * @param srcRootDir * 压缩文件夹根目录的子路径 * @param file * 当前递归压缩的文件或目录对象 * @param zos * 压缩文件存储对象 * @throws Exception */
    private static void zip(String srcRootDir, File file, ZipOutputStream zos)
            throws Exception {
        if (file == null) {
            return;
        }

        // 如果是文件,则直接压缩该文件
        if (file.isFile()) {
            int count, bufferLen = 1024;
            byte data[] = new byte[bufferLen];

            // 获取文件相对于压缩文件夹根目录的子路径
            String subPath = file.getAbsolutePath();
            int index = subPath.indexOf(srcRootDir);
            if (index != -1) {
                subPath = subPath.substring(srcRootDir.length()
                        + File.separator.length());
            }
            ZipEntry entry = new ZipEntry(subPath);
            zos.putNextEntry(entry);
            BufferedInputStream bis = new BufferedInputStream(
                    new FileInputStream(file));
            while ((count = bis.read(data, 0, bufferLen)) != -1) {
                zos.write(data, 0, count);
            }
            bis.close();
            zos.closeEntry();
        }
        // 如果是目录,则压缩整个目录
        else {
            // 压缩目录中的文件或子目录
            File[] childFileList = file.listFiles();
            for (int n = 0; n < childFileList.length; n++) {
                childFileList[n].getAbsolutePath().indexOf(
                        file.getAbsolutePath());
                zip(srcRootDir, childFileList[n], zos);
            }
        }
    }

    /** * 对文件或文件目录进行压缩 * * @param srcPath * 要压缩的源文件路径。如果压缩一个文件,则为该文件的全路径;如果压缩一个目录,则为该目录的顶层目录路径 * @param zipPath * 压缩文件保存的路径。注意:zipPath不能是srcPath路径下的子文件夹 * @param zipFileName * 压缩文件名 * @throws Exception */
    public static void zip(String srcPath, String zipPath, String zipFileName)
            throws Exception {
        if (isEmpty(srcPath) || isEmpty(zipPath) || isEmpty(zipFileName)) {
            throw new Exception("PARAMETER_IS_NULL");
        }
        CheckedOutputStream cos = null;
        ZipOutputStream zos = null;
        try {
            File srcFile = new File(srcPath);

            // 判断压缩文件保存的路径是否为源文件路径的子文件夹,如果是,则抛出异常(防止无限递归压缩的发生)
            if (srcFile.isDirectory() && zipPath.indexOf(srcPath) != -1) {
                throw new Exception(
                        "zipPath must not be the child directory of srcPath.");
            }

            // 判断压缩文件保存的路径是否存在,如果不存在,则创建目录
            File zipDir = new File(zipPath);
            if (!zipDir.exists() || !zipDir.isDirectory()) {
                zipDir.mkdirs();
            }

            // 创建压缩文件保存的文件对象
            String zipFilePath = zipPath + File.separator + zipFileName;
            File zipFile = new File(zipFilePath);
            if (zipFile.exists()) {
                // 检测文件是否允许删除,如果不允许删除,将会抛出SecurityException
                SecurityManager securityManager = new SecurityManager();
                securityManager.checkDelete(zipFilePath);
                // 删除已存在的目标文件
                zipFile.delete();
            }

            cos = new CheckedOutputStream(new FileOutputStream(zipFile),
                    new CRC32());
            zos = new ZipOutputStream(cos);

            // 如果只是压缩一个文件,则需要截取该文件的父目录
            String srcRootDir = srcPath;
            if (srcFile.isFile()) {
                int index = srcPath.lastIndexOf(File.separator);
                if (index != -1) {
                    srcRootDir = srcPath.substring(0, index);
                }
            }
            // 调用递归压缩方法进行目录或文件压缩
            zip(srcRootDir, srcFile, zos);
            zos.flush();
        } catch (Exception e) {
            throw e;
        } finally {
            try {
                if (zos != null) {
                    zos.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /** * 解压缩zip包 * * @param zipFilePath * zip文件的全路径 * @param unzipFilePath * 解压后的文件保存的路径 * @param includeZipFileName * 解压后的文件保存的路径是否包含压缩文件的文件名。true-包含;false-不包含 */
    @SuppressWarnings("unchecked")
    public static void unzip(String zipFilePath, String unzipFilePath,
            boolean includeZipFileName) throws Exception {
        if (isEmpty(zipFilePath) || isEmpty(unzipFilePath)) {
            throw new Exception("PARAMETER_IS_NULL");
        }
        File zipFile = new File(zipFilePath);
        // 如果解压后的文件保存路径包含压缩文件的文件名,则追加该文件名到解压路径
        if (includeZipFileName) {
            String fileName = zipFile.getName();
            if (isNotEmpty(fileName)) {
                fileName = fileName.substring(0, fileName.lastIndexOf("."));
            }
            unzipFilePath = unzipFilePath + File.separator + fileName;
        }
        // 创建解压缩文件保存的路径
        File unzipFileDir = new File(unzipFilePath);
        if (!unzipFileDir.exists() || !unzipFileDir.isDirectory()) {
            unzipFileDir.mkdirs();
        }

        // 开始解压
        ZipEntry entry = null;
        String entryFilePath = null, entryDirPath = null;
        File entryFile = null, entryDir = null;
        int index = 0, count = 0, bufferSize = 1024;
        byte[] buffer = new byte[bufferSize];
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        //E:\projectTest\downloadPath\payseat_1.0
        ZipFile zip = new ZipFile(zipFile);
        Enumeration<ZipEntry> entries = (Enumeration<ZipEntry>) zip.entries();
        // 循环对压缩包里的每一个文件进行解压
        while (entries.hasMoreElements()) {
            entry = entries.nextElement();
            if (entry.isDirectory()) {
                continue;
            }
            // 构建压缩包中一个文件解压后保存的文件全路径
            entryFilePath = unzipFilePath + File.separator + entry.getName();
            // 构建解压后保存的文件夹路径
            index = entryFilePath.lastIndexOf(File.separator)>entryFilePath.lastIndexOf("/")?entryFilePath.lastIndexOf(File.separator):entryFilePath.lastIndexOf("/");
            if (index != -1) {
                entryDirPath = entryFilePath.substring(0, index);
            } else {
                entryDirPath = "";
            }
            entryDir = new File(entryDirPath);
            // 如果文件夹路径不存在,则创建文件夹
            if (!entryDir.exists() || !entryDir.isDirectory()) {
                entryDir.mkdirs();
            }

            // 创建解压文件
            entryFile = new File(entryFilePath);
            if (entryFile.exists()) {
                /*// 检测文件是否允许删除,如果不允许删除,将会抛出SecurityException SecurityManager securityManager = new SecurityManager(); securityManager.checkDelete(entryFilePath);*/
                // 删除已存在的目标文件
                entryFile.delete();
            }
            try {
                // 写入文件
                bos = new BufferedOutputStream(new FileOutputStream(entryFile));
                bis = new BufferedInputStream(zip.getInputStream(entry));
                while ((count = bis.read(buffer, 0, bufferSize)) != -1) {
                    bos.write(buffer, 0, count);
                }
                bos.flush();
                bos.close();
                bis.close();
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
                logger.warn("unzip file "+entry.getName()+" exception :"+e);
            }

        }

    }
    @SuppressWarnings("unchecked")
    public static void unPartZip(String zipFilePath, String unzipFilePath) throws Exception {
        if (isEmpty(zipFilePath) || isEmpty(unzipFilePath)) {
            throw new Exception("PARAMETER_IS_NULL");
        }
        File zipFile = new File(zipFilePath);

        // 创建解压缩文件保存的路径
        File unzipFileDir = new File(unzipFilePath);
        if (!unzipFileDir.exists() || !unzipFileDir.isDirectory()) {
            unzipFileDir.mkdirs();
        }

        // 开始解压
        ZipEntry entry = null;
        String entryFilePath = null, entryDirPath = null;
        File entryFile = null, entryDir = null;
        int index = 0, count = 0, bufferSize = 1024;
        byte[] buffer = new byte[bufferSize];
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        //E:\projectTest\downloadPath\payseat_1.0
        ZipFile zip = new ZipFile(zipFile);
        Enumeration<ZipEntry> entries = (Enumeration<ZipEntry>) zip.entries();
        // 循环对压缩包里的每一个文件进行解压
        while (entries.hasMoreElements()) {
            entry = entries.nextElement();
            if (entry.isDirectory()) {
                continue;
            }
            // 构建压缩包中一个文件解压后保存的文件全路径
            entryFilePath = unzipFilePath + File.separator + entry.getName();
            // 构建解压后保存的文件夹路径
            index = entryFilePath.lastIndexOf(File.separator)>entryFilePath.lastIndexOf("/")?entryFilePath.lastIndexOf(File.separator):entryFilePath.lastIndexOf("/");
            if (index != -1) {
                entryDirPath = entryFilePath.substring(0, index);
            } else {
                entryDirPath = "";
            }
            entryDir = new File(entryDirPath);
            // 如果文件夹路径不存在,则创建文件夹
            if (!entryDir.exists() || !entryDir.isDirectory()) {
                entryDir.mkdirs();
            }

            // 创建解压文件
            entryFile = new File(entryFilePath);
            if (entryFile.exists()) {
                /*// 检测文件是否允许删除,如果不允许删除,将会抛出SecurityException SecurityManager securityManager = new SecurityManager(); securityManager.checkDelete(entryFilePath);*/
                // 删除已存在的目标文件
                entryFile.delete();
            }
            try {
                // 写入文件
                bos = new BufferedOutputStream(new FileOutputStream(entryFile));
                bis = new BufferedInputStream(zip.getInputStream(entry));
                while ((count = bis.read(buffer, 0, bufferSize)) != -1) {
                    bos.write(buffer, 0, count);
                }
                bos.flush();
                bos.close();
                bis.close();
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
                logger.warn("unzip file "+entry.getName()+" exception :"+e);
            }

        }

    }

    /** * @description:生成最新的版本文件全量包 * @return */
    public static File createDownloadZip(){
        //备份保存目录
        String backupPath = SysPropUtil.getValue("backupPath");
        //当前版本信息
        String currentVersion = SysPropUtil.getValue("currentVersion");
        String currentKey = SysPropUtil.getValue("currentVersionKey");
        String currentVersionStartTime = SysPropUtil.getValue("currentVersionStartTime");
        //更新版本信息
        String updateVersion = SysPropUtil.getValue("updateVersion");
        String updateVersionKey = SysPropUtil.getValue("updateVersionKey");
        String updateVersionStartTime = SysPropUtil.getValue("updateVersionStartTime");
        //
        String currentZipName = currentVersion+"_"+currentKey+"_"+currentVersionStartTime;
        String updateZipName = updateVersion+"_"+updateVersionKey+"_"+updateVersionStartTime;
        String updateFile = backupPath+"\\"+updateZipName+".zip";       
        //当前版本的全量包
        String fullCurrentFile = backupPath+"\\"+currentZipName+"_F.zip";
        //生成的供下载的版本的全量包
        String fullUpdateFile = backupPath+"\\"+updateZipName+"_F.zip";

        ZipFile currentZip = null;
        ZipFile updateZip = null;
        ZipOutputStream zos = null;
        //当前版本全量压缩包
        File currentFile = null;
        //结果全量压缩包
        File resultFile = null;
        try{
            currentFile = new File(fullCurrentFile);
            resultFile = new File(fullUpdateFile);

            //当前版本全量压缩包已存在则跳过
            if (!currentFile.exists()) {
                //生成当前版本的全量压缩包
                zip("C:\\cuss\\apps",backupPath,currentZipName+"_F.zip");
            }

            //结果全量压缩包已存在直接返回
            if (resultFile.exists() && resultFile.length() > 0) {
                return resultFile;
            }

            zos = new ZipOutputStream(new FileOutputStream(fullUpdateFile));            

            currentZip = new ZipFile(currentFile);
            updateZip = new ZipFile(new File(updateFile));
            Enumeration<? extends ZipEntry> currentEntrys = currentZip.entries();
            Enumeration<? extends ZipEntry> updateEntrys = updateZip.entries();


            String currentInnerName = "";
            String updateInnerName = "";

            //最新版本压缩包的所有内容都应放入生成的最新全量压缩包
            while(updateEntrys.hasMoreElements()){
                ZipEntry update = updateEntrys.nextElement();
                //获取压缩包内文件名
                updateInnerName = getInnerName(update,updateVersion);                   
                if(!updateInnerName.equals("")){
                    ZipEntry entry = new ZipEntry(updateInnerName);
                    zos.putNextEntry(entry);
                    putNextEntry(updateZip,update,zos);
                }
            }


            while(currentEntrys.hasMoreElements()){
                ZipEntry current = currentEntrys.nextElement();
                //获取压缩包内文件名
                currentInnerName = getInnerName(current,currentVersion);
                //是否有同名文件
                boolean hasSameOne = false;
                Enumeration<? extends ZipEntry> updateEntrys2 = updateZip.entries();
                while(updateEntrys2.hasMoreElements()){
                    ZipEntry update = updateEntrys2.nextElement();
                    //获取压缩包内文件名
                    updateInnerName = getInnerName(update,updateVersion);
                    //如果有同名文件
                    if(currentInnerName.equals(updateInnerName)){
                        hasSameOne = true;
                        break;
                    }                   
                }
                //没有同名文件
                if(hasSameOne == false && !currentInnerName.equals("")){
                    ZipEntry entry = new ZipEntry(currentInnerName);
                    zos.putNextEntry(entry);
                    putNextEntry(currentZip,current,zos);
                }

            }

            zos.flush();
            currentZip.close();
            updateZip.close();

            return resultFile;
        }catch(Exception e){
            e.printStackTrace();
            return null;
        }finally{
            try {
                if(zos !=null){
                    zos.close();
                }
                //删除当前版本临时全量压缩包
                //new File(fullCurrentFile).delete();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
    /** * * @Description:专为生效动作打造的解压缩方法 * @param zipFilePath 压缩文件 * @param unZipPath 解压目录 * @param versionName 包含的版本 */
    public static boolean unZip(String zipFilePath,String unZipPath,String versionName) {
        boolean result = true;
        ZipFile zip = null;
        try{
            zip = new ZipFile(zipFilePath);
            //String zipFileName = zip.getName();
            //String zipName = zipFileName.substring(zipFileName.lastIndexOf("\\")+1,
            // zipFileName.length()-4);

            Enumeration<? extends ZipEntry> entrys = zip.entries();

            ZipEntry entry;
            String name;
            String path;
            File file;
            FileOutputStream fos;
            BufferedOutputStream bos;
            InputStream input;
            BufferedInputStream bis;
            while(entrys.hasMoreElements()){
                entry = entrys.nextElement();
                name = getInnerName(entry,versionName);
                path = unZipPath+"\\"+name;
                file = new File(path);
                //根目录
                if("".equals(name)){
                    continue;
                }
                //文件夹
                if(name.endsWith("/")) {
                    file.mkdir();
                    continue;
                }
                else {
                    file.createNewFile();
                }

                //压缩文件输入输出
                fos = new FileOutputStream(file);
                bos = new BufferedOutputStream(fos);

                byte[] buf = new byte[1024];
                int read;
                input = zip.getInputStream(entry);
                bis = new BufferedInputStream(input);
                while((read = bis.read(buf,0,buf.length)) != -1){
                    bos.write(buf,0,read);
                }
                bos.flush();
                input.close();
                fos.close();
            }

            return result;
        } catch(Exception e) {      
            e.printStackTrace();

            return false;
        }
    }

    private static void putNextEntry(ZipFile zip,ZipEntry entry,ZipOutputStream zos){
        try {
            InputStream input = zip.getInputStream(entry);
            byte[] buf = new byte[1024];
            int read;
            while((read = input.read(buf,0,buf.length)) != -1){
                zos.write(buf,0,read);
            }

            zos.closeEntry();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static String getInnerName(ZipEntry entry,String versionName){
        String name = entry.getName();
        if(name.indexOf(versionName) != -1){
        String  result = name.substring((versionName+File.separator).length());         
            return result;
        }else{
            return name;
        }       
    }



    public static boolean isEmpty(String s) {
        if (s == null || s.equals(""))
            return true;
        else
            return false;
    }

    public static boolean isNotEmpty(String s) {
        return !isEmpty(s);
    }

    /*public static void main(String[] args) { String zipPath = "C:\\cuss\\apps"; String dir = "C:\\Users\\dgy\\Desktop\\backup"; String zipFileName = "CussStore_V3.4.1.zip"; try { zip(zipPath, dir, zipFileName); } catch (Exception e) { e.printStackTrace(); } File file = ZipUtil.createDownloadZip(); System.out.println(file.length()); }*/
}

今天的文章使用ZipEntry压缩与解压缩分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/30001.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注