• java 压缩包


    package com.gome.budget.common.utils;
    
    import org.apache.commons.compress.archivers.ArchiveEntry;
    import org.apache.commons.compress.archivers.ArchiveInputStream;
    import org.apache.commons.compress.archivers.ArchiveStreamFactory;
    import org.apache.commons.compress.archivers.zip.Zip64Mode;
    import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
    import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
    
    import java.io.*;
    import java.util.ArrayList;
    import java.util.List;
    
    public class CompressUtil {
    
        /**
         * zip压缩文件
         * @param dir
         * @param zippath
         */
        public static void zip(String dir ,String zippath){
            List<String> paths = getFiles(dir);
            compressFilesZip(paths.toArray(new String[paths.size()]),zippath,dir    );
        }
    
        /**
         * 递归取到当前目录所有文件
         * @param dir
         * @return
         */
        public static List<String> getFiles(String dir){
            List<String> lstFiles = null;
            if(lstFiles == null){
                lstFiles = new ArrayList<String>();
            }
            File file = new File(dir);
            File [] files = file.listFiles();
            for(File f : files){
                if(f.isDirectory()){
                    lstFiles.add(f.getAbsolutePath());
                    lstFiles.addAll(getFiles(f.getAbsolutePath()));
                }else{
                    String str =f.getAbsolutePath();
                    lstFiles.add(str);
                }
            }
            return lstFiles;
        }
    
        /**
         * 文件名处理
         * @param dir
         * @param path
         * @return
         */
        public static String getFilePathName(String dir,String path){
            String p = path.replace(dir + File.separator, "");
            p = p.replace("\", "/");
            return p;
        }
        /**
         * 把文件压缩成zip格式
         * @param files         需要压缩的文件
         * @param zipFilePath 压缩后的zip文件路径   ,如"D:/test/aa.zip";
         */
        public static void compressFilesZip(String[] files,String zipFilePath,String dir) {
            if(files == null || files.length <= 0) {
                return ;
            }
            ZipArchiveOutputStream zaos = null;
            try {
                File zipFile = new File(zipFilePath);
                zaos = new ZipArchiveOutputStream(zipFile);
                zaos.setUseZip64(Zip64Mode.AsNeeded);
                //将每个文件用ZipArchiveEntry封装
                //再用ZipArchiveOutputStream写到压缩文件中
                for(String strfile : files) {
                    File file = new File(strfile);
                    if(file != null) {
                        String name = getFilePathName(dir,strfile);
                        ZipArchiveEntry zipArchiveEntry  = new ZipArchiveEntry(file,name);
                        zaos.putArchiveEntry(zipArchiveEntry);
                        if(file.isDirectory()){
                            continue;
                        }
                        InputStream is = null;
                        try {
                            is = new BufferedInputStream(new FileInputStream(file));
                            byte[] buffer = new byte[1024 ];
                            int len = -1;
                            while((len = is.read(buffer)) != -1) {
                                //把缓冲区的字节写入到ZipArchiveEntry
                                zaos.write(buffer, 0, len);
                            }
                            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 unzip(String zipFilePath, String saveFileDir) {
            if(!saveFileDir.endsWith("\") && !saveFileDir.endsWith("/") ){
                saveFileDir += File.separator;
            }
            File dir = new File(saveFileDir);
            if(!dir.exists()){
                dir.mkdirs();
            }
            File file = new File(zipFilePath);
            if (!file.exists()) {
                return;
            }
            InputStream is = null;
    //            ZipArchiveInputStream zais = null;
            ArchiveInputStream input = null;
            try {
                is = new FileInputStream(file);
                String archiverName = file.getName().substring(file.getName().lastIndexOf(".") + 1, file.getName().length());
    
                input = new ArchiveStreamFactory()
                        .createArchiveInputStream(archiverName, is);
    
    //                zais = new ZipArchiveInputStream(is, "");
                ArchiveEntry archiveEntry = null;
                while ((archiveEntry = input.getNextEntry()) != null) {
                    // 获取文件名
                    String entryFileName = archiveEntry.getName();
                    // 构造解压出来的文件存放路径
                    String entryFilePath = saveFileDir + entryFileName;
                    OutputStream os = null;
                    try {
                        // 把解压出来的文件写到指定路径
                        File entryFile = new File(entryFilePath);
                        if(entryFileName.endsWith("/")){
                            entryFile.mkdirs();
                        }else{
                            os = new BufferedOutputStream(new FileOutputStream(
                                    entryFile));
                            byte[] buffer = new byte[1024 ];
                            int len = -1;
                            while((len = input.read(buffer)) != -1) {
                                os.write(buffer, 0, len);
                            }
                        }
                    } 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 (input != null) {
                        input.close();
                    }
                    if (is != null) {
                        is.close();
                    }
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    
        public static void main(String[] args) {
            // zip压缩
            String dir = "D:\share\java";
            String zippath = "D:\share\test.zip";
            CompressUtil.zip(dir, zippath);
        }
    
    }
  • 相关阅读:
    对象的创建
    Java运行时数据区域
    Java内存模型
    LinkedList小练习及相关算法
    面试题之矩阵与转置矩阵相乘
    快速排序
    垃圾收集器
    java垃圾收集相关问题
    Win7下安装Centos7双系统出错:No valid bootloader target device found.
    Scanner类的方法
  • 原文地址:https://www.cnblogs.com/honghong75042/p/11057556.html
Copyright © 2020-2023  润新知