• 使用commons-compress操作zip文件(压缩和解压缩)


    http://www.cnblogs.com/luxh/archive/2012/06/28/2568758.html

         Apache Commons Compress是一个压缩、解压缩文件的类库。

      可以操作ar, cpio, Unix dump, tar, zip, gzip, XZ, Pack200 and bzip2格式的文件,功能比较强大。

      在这里写两个用Commons Compress把文件压缩成zip和从zip解压缩的方法。

      直接贴上工具类代码:

    /** 
     * Zip文件工具类 
     * @author Luxh 
     */  
    public class ZipFileUtil {  
           
        /** 
         * 把文件压缩成zip格式 
         * @param files         需要压缩的文件 
         * @param zipFilePath 压缩后的zip文件路径   ,如"D:/test/aa.zip"; 
         */  
        public static void compressFiles2Zip(File[] files,String zipFilePath) {  
            if(files != null && files.length >0) {  
                if(isEndsWithZip(zipFilePath)) {  
                    ZipArchiveOutputStream zaos = null;  
                    try {  
                        File zipFile = new File(zipFilePath);  
                        zaos = new ZipArchiveOutputStream(zipFile);  
                        //Use Zip64 extensions for all entries where they are required  
                        zaos.setUseZip64(Zip64Mode.AsNeeded);  
                           
                        //将每个文件用ZipArchiveEntry封装  
                        //再用ZipArchiveOutputStream写到压缩文件中  
                        for(File file : files) {  
                            if(file != null) {  
                                ZipArchiveEntry zipArchiveEntry  = new ZipArchiveEntry(file,file.getName());  
                                zaos.putArchiveEntry(zipArchiveEntry);  
                                InputStream is = null;  
                                try {  
                                    is = new BufferedInputStream(new FileInputStream(file));  
                                    byte[] buffer = new byte[1024 * 5];    
                                    int len = -1;  
                                    while((len = is.read(buffer)) != -1) {  
                                        //把缓冲区的字节写入到ZipArchiveEntry  
                                        zaos.write(buffer, 0, len);  
                                    }  
                                    //Writes all necessary data for this entry.  
                                    zaos.closeArchiveEntry();    
                                }catch(Exception e) {  
                                    throw new RuntimeException(e);  
                                }finally {  
                                    if(is != null)   
                                        is.close();  
                                }  
                                   
                            }  
                        }  
                        zaos.finish();  
                    }catch(Exception e){  
                        throw new RuntimeException(e);  
                    }finally {  
                            try {  
                                if(zaos != null) {  
                                    zaos.close();  
                                }  
                            } catch (IOException e) {  
                                throw new RuntimeException(e);  
                            }  
                    }  
                       
                }  
                   
            }  
               
        }  
           
        /** 
         * 把zip文件解压到指定的文件夹 
         * @param zipFilePath   zip文件路径, 如 "D:/test/aa.zip" 
         * @param saveFileDir   解压后的文件存放路径, 如"D:/test/" 
         */  
        public static void decompressZip(String zipFilePath,String saveFileDir) {  
            if(isEndsWithZip(zipFilePath)) {  
                File file = new File(zipFilePath);  
                if(file.exists()) {  
                    InputStream is = null;  
                    //can read Zip archives  
                    ZipArchiveInputStream zais = null;  
                    try {  
                        is = new FileInputStream(file);  
                        zais = new ZipArchiveInputStream(is);  
                        ArchiveEntry  archiveEntry = null;  
                        //把zip包中的每个文件读取出来  
                        //然后把文件写到指定的文件夹  
                        while((archiveEntry = zais.getNextEntry()) != null) {  
                            //获取文件名  
                            String entryFileName = archiveEntry.getName();  
                            //构造解压出来的文件存放路径  
                            String entryFilePath = saveFileDir + entryFileName;  
                            byte[] content = new byte[(int) archiveEntry.getSize()];  
                            zais.read(content);  
                            OutputStream os = null;  
                            try {  
                                //把解压出来的文件写到指定路径  
                                File entryFile = new File(entryFilePath);  
                                os = new BufferedOutputStream(new FileOutputStream(entryFile));  
                                os.write(content);  
                            }catch(IOException e) {  
                                throw new IOException(e);  
                            }finally {  
                                if(os != null) {  
                                    os.flush();  
                                    os.close();  
                                }  
                            }  
                               
                        }  
                    }catch(Exception e) {  
                        throw new RuntimeException(e);  
                    }finally {  
                            try {  
                                if(zais != null) {  
                                    zais.close();  
                                }  
                                if(is != null) {  
                                    is.close();  
                                }  
                            } catch (IOException e) {  
                                throw new RuntimeException(e);  
                            }  
                    }  
                }  
            }  
        }  
           
        /** 
         * 判断文件名是否以.zip为后缀 
         * @param fileName        需要判断的文件名 
         * @return 是zip文件返回true,否则返回false 
         */  
        public static boolean isEndsWithZip(String fileName) {  
            boolean flag = false;  
            if(fileName != null && !"".equals(fileName.trim())) {  
                if(fileName.endsWith(".ZIP")||fileName.endsWith(".zip")){  
                    flag = true;  
                }  
            }  
            return flag;  
        }  
           
    }  
    
    测试代码:
    [java] view plain copy print?
    package cn.luxh.test;  
       
    import java.io.File;  
       
    import org.junit.Test;  
       
    import cn.luxh.utils.ZipFileUtil;  
       
    /** 
     * 测试ZipFileUtil的压缩和解压缩方法 
     * @author Luxh 
     */  
    public class ZipFileUtilTest {  
           
        @Test  
        public void testCompressFiles2Zip() {  
            //存放待压缩文件的目录  
            File srcFile = new File("D:/test");  
            //压缩后的zip文件路径  
            String zipFilePath = "d:/test2/test.zip";  
            if(srcFile.exists()) {  
                File[] files = srcFile.listFiles();  
                ZipFileUtil.compressFiles2Zip(files, zipFilePath);  
            }  
        }  
           
        @Test  
        public void testDecompressZip()  {  
            //压缩包所在路径  
            String zipFilePath = "d:/test2/test.zip";  
            //解压后的文件存放目录  
            String saveFileDir = "d:/test2/";  
            //调用解压方法  
            ZipFileUtil.decompressZip(zipFilePath, saveFileDir);  
        }  
    }  
  • 相关阅读:
    vue-autoui自匹配webapi的UI控件
    BeetleX.FastHttpApi之测试插件集成
    BeetleX之XRPC远程委托调用
    BeetleX.AdminUI介绍
    使用NetBenchmark压测TCP,HTTP和Websocket服务
    Beetlex实现完整的HTTP协议
    beetlex网关之聚合和url请求过虑
    XRPC之接口双向调用
    XGBoost类库使用小结
    XGBoost算法原理小结
  • 原文地址:https://www.cnblogs.com/dhcn/p/7105442.html
Copyright © 2020-2023  润新知