首页 > 代码库 > 使用commons-compress操作zip文件(压缩和解压缩)

使用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);      }  }  

 

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