我是靠谱客的博主 微笑鞋垫,最近开发中收集的这篇文章主要介绍java zip API实现压缩和解压缩zip包,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

  1. package zip;  
  2.   
  3. import java.io.BufferedInputStream;  
  4. import java.io.BufferedOutputStream;  
  5. import java.io.File;  
  6. import java.io.FileInputStream;  
  7. import java.io.FileOutputStream;  
  8. import java.util.Enumeration;  
  9. import java.util.zip.CRC32;  
  10. import java.util.zip.CheckedOutputStream;  
  11. import java.util.zip.ZipEntry;  
  12. import java.util.zip.ZipFile;  
  13. import java.util.zip.ZipOutputStream;  
  14.   
  15. import org.apache.commons.lang3.StringUtils;  
  16.   
  17. public class ZipUtil {  
  18.       
  19.     /** 
  20.      * 递归压缩文件夹 
  21.      * @param srcRootDir 压缩文件夹根目录的子路径 
  22.      * @param file 当前递归压缩的文件或目录对象 
  23.      * @param zos 压缩文件存储对象 
  24.      * @throws Exception 
  25.      */  
  26.     private static void zip(String srcRootDir, File file, ZipOutputStream zos) throws Exception  
  27.     {  
  28.         if (file == null)   
  29.         {  
  30.             return;  
  31.         }                 
  32.           
  33.         //如果是文件,则直接压缩该文件  
  34.         if (file.isFile())  
  35.         {             
  36.             int count, bufferLen = 1024;  
  37.             byte data[] = new byte[bufferLen];  
  38.               
  39.             //获取文件相对于压缩文件夹根目录的子路径  
  40.             String subPath = file.getAbsolutePath();  
  41.             int index = subPath.indexOf(srcRootDir);  
  42.             if (index != -1)   
  43.             {  
  44.                 subPath = subPath.substring(srcRootDir.length() + File.separator.length());  
  45.             }  
  46.             ZipEntry entry = new ZipEntry(subPath);  
  47.             zos.putNextEntry(entry);  
  48.             BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));  
  49.             while ((count = bis.read(data, 0, bufferLen)) != -1)   
  50.             {  
  51.                 zos.write(data, 0, count);  
  52.             }  
  53.             bis.close();  
  54.             zos.closeEntry();  
  55.         }  
  56.         //如果是目录,则压缩整个目录  
  57.         else   
  58.         {  
  59.             //压缩目录中的文件或子目录  
  60.             File[] childFileList = file.listFiles();  
  61.             for (int n=0; n<childFileList.length; n++)  
  62.             {  
  63.                 childFileList[n].getAbsolutePath().indexOf(file.getAbsolutePath());  
  64.                 zip(srcRootDir, childFileList[n], zos);  
  65.             }  
  66.         }  
  67.     }  
  68.       
  69.     /** 
  70.      * 对文件或文件目录进行压缩 
  71.      * @param srcPath 要压缩的源文件路径。如果压缩一个文件,则为该文件的全路径;如果压缩一个目录,则为该目录的顶层目录路径 
  72.      * @param zipPath 压缩文件保存的路径。注意:zipPath不能是srcPath路径下的子文件夹 
  73.      * @param zipFileName 压缩文件名 
  74.      * @throws Exception 
  75.      */  
  76.     public static void zip(String srcPath, String zipPath, String zipFileName) throws Exception  
  77.     {  
  78.         if (StringUtils.isEmpty(srcPath) || StringUtils.isEmpty(zipPath) || StringUtils.isEmpty(zipFileName))  
  79.         {  
  80.             throw new ParameterException(ICommonResultCode.PARAMETER_IS_NULL);  
  81.         }  
  82.         CheckedOutputStream cos = null;  
  83.         ZipOutputStream zos = null;                       
  84.         try  
  85.         {  
  86.             File srcFile = new File(srcPath);  
  87.               
  88.             //判断压缩文件保存的路径是否为源文件路径的子文件夹,如果是,则抛出异常(防止无限递归压缩的发生)  
  89.             if (srcFile.isDirectory() && zipPath.indexOf(srcPath)!=-1)   
  90.             {  
  91.                 throw new ParameterException(ICommonResultCode.INVALID_PARAMETER, "zipPath must not be the child directory of srcPath.");  
  92.             }  
  93.               
  94.             //判断压缩文件保存的路径是否存在,如果不存在,则创建目录  
  95.             File zipDir = new File(zipPath);  
  96.             if (!zipDir.exists() || !zipDir.isDirectory())  
  97.             {  
  98.                 zipDir.mkdirs();  
  99.             }  
  100.               
  101.             //创建压缩文件保存的文件对象  
  102.             String zipFilePath = zipPath + File.separator + zipFileName;  
  103.             File zipFile = new File(zipFilePath);             
  104.             if (zipFile.exists())  
  105.             {  
  106.                 //检测文件是否允许删除,如果不允许删除,将会抛出SecurityException  
  107.                 SecurityManager securityManager = new SecurityManager();  
  108.                 securityManager.checkDelete(zipFilePath);  
  109.                 //删除已存在的目标文件  
  110.                 zipFile.delete();                 
  111.             }  
  112.               
  113.             cos = new CheckedOutputStream(new FileOutputStream(zipFile), new CRC32());  
  114.             zos = new ZipOutputStream(cos);  
  115.               
  116.             //如果只是压缩一个文件,则需要截取该文件的父目录  
  117.             String srcRootDir = srcPath;  
  118.             if (srcFile.isFile())  
  119.             {  
  120.                 int index = srcPath.lastIndexOf(File.separator);  
  121.                 if (index != -1)  
  122.                 {  
  123.                     srcRootDir = srcPath.substring(0, index);  
  124.                 }  
  125.             }  
  126.             //调用递归压缩方法进行目录或文件压缩  
  127.             zip(srcRootDir, srcFile, zos);  
  128.             zos.flush();  
  129.         }  
  130.         catch (Exception e)   
  131.         {  
  132.             throw e;  
  133.         }  
  134.         finally   
  135.         {             
  136.             try  
  137.             {  
  138.                 if (zos != null)  
  139.                 {  
  140.                     zos.close();  
  141.                 }                 
  142.             }  
  143.             catch (Exception e)  
  144.             {  
  145.                 e.printStackTrace();  
  146.             }             
  147.         }  
  148.     }  
  149.       
  150.     /** 
  151.      * 解压缩zip包 
  152.      * @param zipFilePath zip文件的全路径 
  153.      * @param unzipFilePath 解压后的文件保存的路径 
  154.      * @param includeZipFileName 解压后的文件保存的路径是否包含压缩文件的文件名。true-包含;false-不包含 
  155.      */  
  156.     @SuppressWarnings("unchecked")  
  157.     public static void unzip(String zipFilePath, String unzipFilePath, boolean includeZipFileName) throws Exception  
  158.     {  
  159.         if (StringUtils.isEmpty(zipFilePath) || StringUtils.isEmpty(unzipFilePath))  
  160.         {  
  161.             throw new ParameterException(ICommonResultCode.PARAMETER_IS_NULL);            
  162.         }  
  163.         File zipFile = new File(zipFilePath);  
  164.         //如果解压后的文件保存路径包含压缩文件的文件名,则追加该文件名到解压路径  
  165.         if (includeZipFileName)  
  166.         {  
  167.             String fileName = zipFile.getName();  
  168.             if (StringUtils.isNotEmpty(fileName))  
  169.             {  
  170.                 fileName = fileName.substring(0, fileName.lastIndexOf("."));  
  171.             }  
  172.             unzipFilePath = unzipFilePath + File.separator + fileName;  
  173.         }  
  174.         //创建解压缩文件保存的路径  
  175.         File unzipFileDir = new File(unzipFilePath);  
  176.         if (!unzipFileDir.exists() || !unzipFileDir.isDirectory())  
  177.         {  
  178.             unzipFileDir.mkdirs();  
  179.         }  
  180.           
  181.         //开始解压  
  182.         ZipEntry entry = null;  
  183.         String entryFilePath = null, entryDirPath = null;  
  184.         File entryFile = null, entryDir = null;  
  185.         int index = 0, count = 0, bufferSize = 1024;  
  186.         byte[] buffer = new byte[bufferSize];  
  187.         BufferedInputStream bis = null;  
  188.         BufferedOutputStream bos = null;  
  189.         ZipFile zip = new ZipFile(zipFile);  
  190.         Enumeration<ZipEntry> entries = (Enumeration<ZipEntry>)zip.entries();  
  191.         //循环对压缩包里的每一个文件进行解压       
  192.         while(entries.hasMoreElements())  
  193.         {  
  194.             entry = entries.nextElement();  
  195.             //构建压缩包中一个文件解压后保存的文件全路径  
  196.             entryFilePath = unzipFilePath + File.separator + entry.getName();  
  197.             //构建解压后保存的文件夹路径  
  198.             index = entryFilePath.lastIndexOf(File.separator);  
  199.             if (index != -1)  
  200.             {  
  201.                 entryDirPath = entryFilePath.substring(0, index);  
  202.             }  
  203.             else  
  204.             {  
  205.                 entryDirPath = "";  
  206.             }             
  207.             entryDir = new File(entryDirPath);  
  208.             //如果文件夹路径不存在,则创建文件夹  
  209.             if (!entryDir.exists() || !entryDir.isDirectory())  
  210.             {  
  211.                 entryDir.mkdirs();  
  212.             }  
  213.               
  214.             //创建解压文件  
  215.             entryFile = new File(entryFilePath);  
  216.             if (entryFile.exists())  
  217.             {  
  218.                 //检测文件是否允许删除,如果不允许删除,将会抛出SecurityException  
  219.                 SecurityManager securityManager = new SecurityManager();  
  220.                 securityManager.checkDelete(entryFilePath);  
  221.                 //删除已存在的目标文件  
  222.                 entryFile.delete();   
  223.             }  
  224.               
  225.             //写入文件  
  226.             bos = new BufferedOutputStream(new FileOutputStream(entryFile));  
  227.             bis = new BufferedInputStream(zip.getInputStream(entry));  
  228.             while ((count = bis.read(buffer, 0, bufferSize)) != -1)  
  229.             {  
  230.                 bos.write(buffer, 0, count);  
  231.             }  
  232.             bos.flush();  
  233.             bos.close();              
  234.         }  
  235.     }  
  236.       
  237.     public static void main(String[] args)   
  238.     {  
  239.         String zipPath = "d:\ziptest\zipPath";  
  240.         String dir = "d:\ziptest\rawfiles";  
  241.         String zipFileName = "test.zip";  
  242.         try  
  243.         {  
  244.             zip(dir, zipPath, zipFileName);  
  245.         }   
  246.         catch (Exception e)  
  247.         {  
  248.             e.printStackTrace();  
  249.         }  
  250.           
  251.         String zipFilePath = "D:\ziptest\zipPath\test.zip";  
  252.         String unzipFilePath = "D:\ziptest\zipPath";  
  253.         try   
  254.         {  
  255.             unzip(zipFilePath, unzipFilePath, true);  
  256.         }  
  257.         catch (Exception e)  
  258.         {  
  259.             e.printStackTrace();  
  260.         }  
  261.     }  
  262. }  

最后

以上就是微笑鞋垫为你收集整理的java zip API实现压缩和解压缩zip包的全部内容,希望文章能够帮你解决java zip API实现压缩和解压缩zip包所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部