• zip压缩与解压文件夹或文件


    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.zip.CRC32;
    import java.util.zip.CheckedOutputStream;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipInputStream;
    import java.util.zip.ZipOutputStream;
    
    import com.hyb.constant.Constant;
    
    /**
     *         <p>
     *         程序实现了ZIP压缩[compression]
     *         <p>
     *         大致功能包括用了多态,递归等JAVA核心技术,可以对单个文件和任意级联文件夹进行压缩和解压。 需在代码中自定义源输入路径和目标输出路径。
     *         <p>
     *         在本段代码中,实现的是压缩部分
     */
    public class ZipUtil {
        
        /**
         * @param zipFileName
         *            生成后得压缩文件目录
         * @param inputFile
         *            要压缩的目录
         * @throws Exception
         */
        public static void zip(String zipFileName, File inputFile) throws Exception {
            Constant.LOGGER.info("压缩中...");
            ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFileName));
            BufferedOutputStream bo = new BufferedOutputStream(out);
            zip(out, inputFile, inputFile.getName(), bo);
            bo.close();
            out.close(); // 输出流关闭
            Constant.LOGGER.info("压缩完成");
        }
    
        public static void zip(ZipOutputStream out, File f, String base,
                BufferedOutputStream bo) throws Exception { // 方法重载
            if (f.isDirectory()) {
                File[] fl = f.listFiles();
                if (fl.length == 0) {
                    out.putNextEntry(new ZipEntry(base + "/")); // 创建zip压缩进入点base
                    Constant.LOGGER.info(base + "/");
                }
                for (int i = 0; i < fl.length; i++) {
                    zip(out, fl[i], base + "/" + fl[i].getName(), bo); // 递归遍历子文件夹
                }
            } else {
                out.putNextEntry(new ZipEntry(base)); // 创建zip压缩进入点base
                Constant.LOGGER.info(base);
                FileInputStream in = new FileInputStream(f);
                BufferedInputStream bi = new BufferedInputStream(in);
                int b;
                while ((b = bi.read()) != -1) {
                    bo.write(b); // 将字节流写入当前zip目录
                }
                bi.close();
                in.close(); // 输入流关闭
            }
        }
    
        public static void zip(String srcPath, String zipPath, String zipFileName)
                throws Exception {
    
            CheckedOutputStream cos = null;
            ZipOutputStream zos = null;
            try {
                File srcFile = new File(srcPath);
    
                // 判断压缩文件保存的路径是否为源文件路径的子文件夹,如果是,则抛出异常(防止无限递归压缩的发生)
                if (srcFile.isDirectory() && zipPath.indexOf(srcPath) != -1) {
                    throw new Exception("压缩文件保存的路径是否为源文件路径的子文件夹");
                }
    
                // 判断压缩文件保存的路径是否存在,如果不存在,则创建目录
                File zipDir = new File(zipPath);
                if (!zipDir.exists() || !zipDir.isDirectory()) {
                    zipDir.mkdirs();
                }
    
                // 创建压缩文件保存的文件对象
                String zipFilePath = zipPath + File.separator + zipFileName;
                File zipFile = new File(zipFilePath);
    
                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();
                }
            }
        }
         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(file.getName());
                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);
                }
            }
        }
         
         public static void unzip(String zipPath, String targetPath) {  
            long startTime=System.currentTimeMillis();  
            try {  
                ZipInputStream zin=new ZipInputStream(new FileInputStream(zipPath));//输入源zip路径  
                BufferedInputStream bin=new BufferedInputStream(zin);  
                File Fout=null;  
                ZipEntry entry;  
                try {  
                    while((entry = zin.getNextEntry())!=null && !entry.isDirectory()){  
                        Fout=new File(targetPath,entry.getName());  
                        if(!Fout.exists()){  
                            (new File(Fout.getParent())).mkdirs();  
                        }  
                        FileOutputStream out=new FileOutputStream(Fout);  
                        BufferedOutputStream Bout=new BufferedOutputStream(out);  
                        int b;  
                        while((b=bin.read())!=-1){  
                            Bout.write(b);  
                        }  
                        Bout.close();  
                        out.close();  
                        Constant.LOGGER.info(Fout+"解压成功");
                    }  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  finally {
                     try {
                        if (bin != null) {
                            bin.close();
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }  
                     try {
                        if (zin != null) {
                            zin.close();
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }  
                }
            } catch (FileNotFoundException e) {  
                e.printStackTrace();  
            }  
            long endTime=System.currentTimeMillis();  
            Constant.LOGGER.info("耗费时间: "+(endTime-startTime)+" ms");  
        }  
         
        /**
         * 测试
         * 
         * @param args
         */
        public static void main(String[] args) {
            try {
    //            ZipUtil.zip("G:\a.zip", new File("G:\a"));
                unzip("G:\a.zip", "G:\a");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
  • 相关阅读:
    互联网搜索引擎——文本预处理
    nltk的pos_tag
    nltk.stem 词干提取(stemming)
    python3的encode和decode涉及的str和bytes转换
    power rails 'GND' and 'VCC/VDD' are interconnected in net VCC
    impot不能导入自己写的python文件【爆红】
    No module named 'tensorflow.contrib'
    解决spark-submit的There is insufficient memory for the Java Runtime Environment to continue.(老顽固问题) failed; error='Cannot allocate memory' (errno=12)
    spark的standalone模式下:查看任务结束后的历史记录
    只是为了保存一些有用链接而已
  • 原文地址:https://www.cnblogs.com/shihaiming/p/8465890.html
Copyright © 2020-2023  润新知