• java实现zip压缩和解压工具


     引入ant.jar

    package com.develop.web.util;
    
    import java.io.BufferedInputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Enumeration;
    
    import org.apache.log4j.Logger;
    import org.apache.tools.zip.ZipEntry;
    import org.apache.tools.zip.ZipFile;
    import org.apache.tools.zip.ZipOutputStream;
    
    public class ZipUtil {
        private static int bufferSize = 2048;
        private static Logger logger = Logger.getLogger(ZipUtil.class);
        
        /**
         * 压缩
         * @param srcFileOrDir 原文件或文件夹
         * @param destZipFilePath 输出到的目标路径,默认zip文件为原文件或文件夹名称
         */
        public static boolean zip(String srcFileOrDir, String destZipFilePath){
            File file = new File(srcFileOrDir);
            if(!file.exists()){
                return false;
            }
            
            String destZipFileName = file.getName();
            
            return zip(srcFileOrDir, destZipFilePath, destZipFileName);
        }
        
        /**
         * 压缩
         * @param srcFileOrDir 原文件或文件夹
         * @param destZipFilePath 输出到的目标路径
         * @param destZipFileName 生成的zip文件名称
         */
        public static boolean zip(String srcFileOrDir, String destZipFilePath, String destZipFileName){
            File file = new File(srcFileOrDir);
            if(!file.exists()){
                logger.info("原文件或文件夹不存在。");
                return false;
            }
            
            if(!destZipFilePath.endsWith(File.separator)){
                destZipFilePath += File.separator;
            }
            
            File destZipFileParentDir = new File(destZipFilePath);
            if(!destZipFileParentDir.exists()){
                destZipFileParentDir.mkdirs();
            }
            
            if(!destZipFileName.endsWith(".zip")&&!destZipFileName.endsWith(".ZIP")){
                destZipFileName += ".zip";
            }
            
            boolean zipResult = false;
            if(file.isFile()){
                zipResult = zipFile(srcFileOrDir, destZipFilePath, destZipFileName);
            }else if(file.isDirectory()){
                zipResult = zipDir(srcFileOrDir, destZipFilePath, destZipFileName);
            }
            
            logger.info("["+srcFileOrDir+"]-->["+destZipFilePath + destZipFileName+"]压缩结果:["+zipResult+"]");
            
            return zipResult;
        }
        
        private static boolean zipFile(String srcFileName, String destZipFilePath, String destZipFileName){
            boolean zipResult = false;
            File srcFile = new File(srcFileName);
            
            ZipOutputStream zipOutputStream = null;
            try {
                zipOutputStream = new ZipOutputStream(new FileOutputStream(destZipFilePath + destZipFileName));
                zipOutputStream.setEncoding(System.getProperty("sun.jnu.encoding"));
                
                String fileName = srcFile.getName();
                ZipEntry entry = new ZipEntry(fileName);
                
                BufferedInputStream bis = null;
                try {
                    zipOutputStream.putNextEntry(entry);
                    bis = new BufferedInputStream(new FileInputStream(srcFile));
                    
                    byte[] buf = new byte[bufferSize];
                    int len;
                    while ((len = bis.read(buf)) >= 0) {
                        zipOutputStream.flush();
                        zipOutputStream.write(buf, 0, len);
                    }
                    zipResult = true;
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    try {
                        if(zipOutputStream!=null){
                            zipOutputStream.closeEntry();
                        }
                        
                        if(bis!=null){
                            bis.close();
                        }
                        
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } finally {
                try {
                    if(zipOutputStream!=null){
                        zipOutputStream.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            
            return zipResult;
        }
        
        private static boolean zipDir(String srcDir, String destZipFilePath, String destZipFileName){
            boolean zipResult = false;
            if(!srcDir.endsWith(File.separator)){
                srcDir += File.separator;
            }
            File srcFile = new File(srcDir);
            File[] files = srcFile.listFiles();
            
            ZipOutputStream zipOutputStream = null;
            try {
                zipOutputStream = new ZipOutputStream(new FileOutputStream(destZipFilePath + destZipFileName));
                zipOutputStream.setEncoding(System.getProperty("sun.jnu.encoding"));
                if(files!=null&&files.length>0){
                    for(File f :files){
                        compressFiles(f, f.getParent() ,zipOutputStream);
                    }
                }
                zipResult = true;
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } finally {
                try {
                    if(zipOutputStream!=null){
                        zipOutputStream.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return zipResult;
        }
        
        private static void compressFiles(File file, String basePath, ZipOutputStream stream){
            if(file==null||stream==null){
                return;
            }
            if(file.isDirectory()){
                ZipEntry entry = new ZipEntry(getEntryPath(file,basePath) + File.separator);
                try {
                    stream.putNextEntry(entry);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                
                File[] files = file.listFiles();
                if(files!=null&&files.length>0){
                    for(File f :files){
                        compressFiles(f, basePath, stream);
                    }
                }
            }else{
                String fileName = getEntryPath(file, basePath);
                ZipEntry entry = new ZipEntry(fileName);
                
                BufferedInputStream bis = null;
                try {
                    stream.putNextEntry(entry);
                    bis = new BufferedInputStream(new FileInputStream(file));
                    
                    byte[] buf = new byte[bufferSize];
                    int len;
                    while ((len = bis.read(buf)) >= 0) {
                        stream.flush();
                        stream.write(buf, 0, len);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    try {
                        if(stream!=null){
                            stream.closeEntry();
                        }
                        
                        if(bis!=null){
                            bis.close();
                        }
                        
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        
        private static String getEntryPath(File file, String basePath){
            String path = file.getPath().substring(basePath.length() + 1);
            return path;
        }
        
        /**
         * 解压
         * @param srcZipFile 压缩文件
         * @param destDir 目标路径
         * @return
         */
        public static boolean unzip(String srcZipFile, String destDir) {
            boolean unzipResult = false;
            ZipFile zipFile = null;
            Enumeration<ZipEntry> entries = null;
            try {
                zipFile = new ZipFile(srcZipFile, System.getProperty("sun.jnu.encoding"));
                if(zipFile!=null){
                    entries = zipFile.getEntries();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            
            if(zipFile==null||entries == null){
                logger.info("压缩文件不存在。");
                return false;
            }
            
            if(!destDir.endsWith(File.separator)){
                destDir += File.separator;
            }
            
            ZipEntry zipEntry = null;
            while (entries.hasMoreElements()) {
                zipEntry = entries.nextElement();
                
                if (isDirectory(zipEntry)) {
                    try {
                        mkDirs(destDir + zipEntry.getName());
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    
                } else {
                    String name = zipEntry.getName();
                    File file = new File(destDir + name);
                    try {
                        mkDirs(file.getParent());
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    
                    try {
                        file.createNewFile();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    
                    InputStream in = null;
                    FileOutputStream out = null;
                    try {
                        in = zipFile.getInputStream(zipEntry);
                        out = new FileOutputStream(file);
                        int c;
                        byte[] by = new byte[1024];
                        while ((c = in.read(by)) != -1) {
                            out.flush();
                            out.write(by, 0, c);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    } finally {
                        if(out!=null){
                            try {
                                out.close();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                        if(in!=null){
                            try {
                                in.close();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }
            
            unzipResult = true;
            logger.info("["+srcZipFile+"]-->["+destDir+"]解压结果:["+unzipResult+"]");
            
            try {
                zipFile.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            
            return unzipResult;
        }
        
        /**
         * 重写判断zipEntry是否是文件夹,他的类方法【zipEntry.isDirectory()】是写死的"/",windows情况下会判断错误。
         * @param zipEntry
         * @return
         */
        private static boolean isDirectory(ZipEntry zipEntry){
            boolean isDirectory = false;
            String name = zipEntry.getName();
            if(name.endsWith(File.separator)){
                isDirectory = true;
            }
            return isDirectory;
        }
        
        private static void mkDirs(String dir){
            if (dir == null || dir.equals("")){
                return;
            }
                
            File file = new File(dir);
            if (!file.exists()){
                file.mkdirs();
            }
                
        }
        
        public static void main(String[] args) {
            zip("D:\test", "D:\test1");
            unzip("D:\test1\test.zip", "D:\test1\");
        }
        
    }
  • 相关阅读:
    在zend framework框架中try{}catch(Exception e){}的跳转问题
    【上】安全HTTPS-全面具体解释对称加密,非对称加密,数字签名,数字证书和HTTPS
    iOS 图像处理-剪裁图像
    Delphi DBGrid记录全选和反选拖动处理
    在DbGrid中,不按下Ctrl,单击鼠标如何实现多选?谢谢
    在DBGrid中实现多选功能
    回车跳到下一个EDIT
    远程控制篇:用Delphi模拟键盘输入/鼠标点击
    SQL的拼接语句在DELPHI中怎么写
    Delphi DbGridEh实现表格没有内容的渐变效果
  • 原文地址:https://www.cnblogs.com/jinzhiming/p/10302984.html
Copyright © 2020-2023  润新知