首页 > 开发 > Java > 正文

Java实现的zip工具类完整实例

2024-07-14 08:43:11
字体:
来源:转载
供稿:网友

本文实例讲述了Java实现的zip工具类。分享给大家供大家参考,具体如下:

实现把zip解压到指定路径,把文件夹压缩到zip,把文件列表压缩为zip的三个方法

import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.nio.charset.Charset;import java.util.ArrayList;import java.util.Enumeration;import java.util.List;import java.util.zip.ZipEntry;import java.util.zip.ZipFile;import java.util.zip.ZipOutputStream;public class ZipUtils{  /**   * 解压zip到指定路径   * @param zipFile 待解压文件   * @param descDir 指定解压路径   * @return fileNames 解压的全部文件名   * @throws IOException   */  public static List<String> unZipFiles(File zipFile, String descDir) throws IOException {     List<String> fileNames = new ArrayList<String>();  ZipFile zip = new ZipFile(zipFile,Charset.forName("GBK"));//解决中文文件夹乱码   String name = zip.getName().substring(zip.getName().lastIndexOf('//')+1, zip.getName().lastIndexOf('.'));   File pathFile = new File(descDir+name);   if (!pathFile.exists())   {    pathFile.mkdirs();   }   String outPath = "";  for (Enumeration<? extends ZipEntry> entries = zip.entries(); entries.hasMoreElements();)  {    ZipEntry entry = (ZipEntry) entries.nextElement();    String zipEntryName = entry.getName();    fileNames.add(zipEntryName);   InputStream in = zip.getInputStream(entry);    outPath = (descDir + name +"/"+ zipEntryName).replaceAll("//*", "/");    // 判断路径是否存在,不存在则创建文件路径    File file = new File(outPath.substring(0, outPath.lastIndexOf('/')));    if (!file.exists())    {     file.mkdirs();    }    // 判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压    if (new File(outPath).isDirectory())    {     continue;    }    // 输出文件路径信息    FileOutputStream out = new FileOutputStream(outPath);    byte[] buf1 = new byte[1024];    int len;    while ((len = in.read(buf1)) > 0) {     out.write(buf1, 0, len);    }    in.close();    out.close();   }   pathFile.delete();  return fileNames;  }  /**   * 压缩文件夹成zip   * @param srcDir 待打包的文件夹路径   * @param out 打包文件名及存储路径   * @param KeepDirStructure 是否保留文件夹结构 不保留则把文件夹下全部文件都打压在一起   * @throws RuntimeException   */  public static void docToZip(String srcDir, OutputStream out, boolean KeepDirStructure)throws RuntimeException  {    long start = System.currentTimeMillis();    ZipOutputStream zos = null ;    try     {      zos = new ZipOutputStream(out);      File sourceFile = new File(srcDir);      compress(sourceFile,zos,sourceFile.getName(),KeepDirStructure);      long end = System.currentTimeMillis();      System.out.println("压缩完成,耗时:" + (end - start) +" ms");    } catch (Exception e)     {      throw new RuntimeException("zip error from ZipUtils",e);    }finally    {      if(zos != null)      {        try         {          zos.close();        } catch (IOException e)        {          e.printStackTrace();        }      }    }  }  /**   * 压缩成ZIP 将多个文件大包   * @param srcFiles 需要压缩的文件列表   * @param out     压缩文件输出流   * @throws RuntimeException 压缩失败会抛出运行时异常   */  public static void filesToZip(List<File> srcFiles , OutputStream out)throws RuntimeException   {    long start = System.currentTimeMillis();    ZipOutputStream zos = null ;    int BUFFER_SIZE = 2 * 1024;    try     {      zos = new ZipOutputStream(out);      for (File srcFile : srcFiles)       {        byte[] buf = new byte[BUFFER_SIZE];        zos.putNextEntry(new ZipEntry(srcFile.getName()));        int len;        FileInputStream in = new FileInputStream(srcFile);        while ((len = in.read(buf)) != -1)        {          zos.write(buf, 0, len);        }        zos.closeEntry();        in.close();      }      long end = System.currentTimeMillis();      System.out.println("压缩完成,耗时:" + (end - start) +" ms");    } catch (Exception e)     {      throw new RuntimeException("zip error from ZipUtils",e);    }finally    {      if(zos != null)      {        try         {          zos.close();        } catch (IOException e)        {          e.printStackTrace();        }      }    }  }  /**   * 递归压缩方法   * @param sourceFile 源文件   * @param zos     zip输出流   * @param name     压缩后的名称   * @param KeepDirStructure 是否保留原来的目录结构,true:保留目录结构;    *               false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)   * @throws Exception   */  private static void compress(File sourceFile, ZipOutputStream zos, String name,      boolean KeepDirStructure) throws Exception  {    int BUFFER_SIZE = 2 * 1024;    byte[] buf = new byte[BUFFER_SIZE];    if(sourceFile.isFile())    {      // 向zip输出流中添加一个zip实体,构造器中name为zip实体的文件的名字      zos.putNextEntry(new ZipEntry(name));      // copy文件到zip输出流中      int len;      FileInputStream in = new FileInputStream(sourceFile);      while ((len = in.read(buf)) != -1)      {        zos.write(buf, 0, len);      }      // Complete the entry      zos.closeEntry();      in.close();    } else    {      File[] listFiles = sourceFile.listFiles();      if(listFiles == null || listFiles.length == 0)      {        // 需要保留原来的文件结构时,需要对空文件夹进行处理        if(KeepDirStructure)        {          // 空文件夹的处理          zos.putNextEntry(new ZipEntry(name + "/"));          // 没有文件,不需要文件的copy          zos.closeEntry();        }      }else       {        for (File file : listFiles)         {          // 判断是否需要保留原来的文件结构          if (KeepDirStructure)           {            // 注意:file.getName()前面需要带上父文件夹的名字加一斜杠,            // 不然最后压缩包中就不能保留原来的文件结构,即:所有文件都跑到压缩包根目录下了            compress(file, zos, name + "/" + file.getName(),KeepDirStructure);          } else           {            compress(file, zos, file.getName(),KeepDirStructure);          }        }      }    }  }}

 

希望本文所述对大家java程序设计有所帮助。


注:相关教程知识阅读请移步到JAVA教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表