首页 > 代码库 > java实现zip压缩文件

java实现zip压缩文件

在网上找到这几种方法,感觉不错,收集起来,方便大家使用

  • jdk自带的包java.util.zip.ZipOutputStream,不足之处,文件(夹)名称带中文时,出现乱码问题,实现代码如下
/**   * 功能:把 sourceDir 目录下的所有文件进行 zip 格式的压缩,保存为指定 zip 文件  * @param sourceDir 如果是目录,eg:D:\\MyEclipse\\first\\testFile,则压缩目录下所有文件;  *      如果是文件,eg:D:\\MyEclipse\\first\\testFile\\aa.zip,则只压缩本文件  * @param zipFile 最后压缩的文件路径和名称,eg:D:\\MyEclipse\\first\\testFile\\aa.zip  */ public File doZip(String sourceDir, String zipFilePath)  throws IOException {    File file = new File(sourceDir);  File zipFile = new File(zipFilePath);  ZipOutputStream zos = null;  try {   // 创建写出流操作   OutputStream os = new FileOutputStream(zipFile);   BufferedOutputStream bos = new BufferedOutputStream(os);   zos = new ZipOutputStream(bos);      String basePath = null;      // 获取目录   if(file.isDirectory()) {    basePath = file.getPath();   }else {    basePath = file.getParent();   }      zipFile(file, basePath, zos);  }finally {   if(zos != null) {    zos.closeEntry();    zos.close();   }  }    return zipFile; } /**   * @param source 源文件  * @param basePath   * @param zos   */ private void zipFile(File source, String basePath, ZipOutputStream zos)  throws IOException {  File[] files = null;  if (source.isDirectory()) {   files = source.listFiles();  } else {   files = new File[1];   files[0] = source;  }    InputStream is = null;  String pathName;  byte[] buf = new byte[1024];  int length = 0;  try{   for(File file : files) {    if(file.isDirectory()) {     pathName = file.getPath().substring(basePath.length() + 1) + "/";     zos.putNextEntry(new ZipEntry(pathName));     zipFile(file, basePath, zos);    }else {     pathName = file.getPath().substring(basePath.length() + 1);     is = new FileInputStream(file);     BufferedInputStream bis = new BufferedInputStream(is);     zos.putNextEntry(new ZipEntry(pathName));     while ((length = bis.read(buf)) > 0) {      zos.write(buf, 0, length);     }    }   }  }finally {   if(is != null) {    is.close();   }  } }
  • 使用org.apache.tools.zip.ZipOutputStream,代码如下
public class ZipCompressor {       static final int BUFFER = 8192;         private File zipFile;         public ZipCompressor(String pathName) {           zipFile = new File(pathName);       }         public void compress(String srcPathName) {           File file = new File(srcPathName);           if (!file.exists())               throw new RuntimeException(srcPathName + "不存在!");           try {               FileOutputStream fileOutputStream = new FileOutputStream(zipFile);               CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream,                       new CRC32());               ZipOutputStream out = new ZipOutputStream(cos);               String basedir = "";               compress(file, out, basedir);               out.close();           } catch (Exception e) {               throw new RuntimeException(e);           }       }         private void compress(File file, ZipOutputStream out, String basedir) {           /* 判断是目录还是文件 */          if (file.isDirectory()) {               System.out.println("压缩:" + basedir + file.getName());               this.compressDirectory(file, out, basedir);           } else {               System.out.println("压缩:" + basedir + file.getName());               this.compressFile(file, out, basedir);           }       }         /** 压缩一个目录 */      private void compressDirectory(File dir, ZipOutputStream out, String basedir) {           if (!dir.exists())               return;             File[] files = dir.listFiles();           for (int i = 0; i < files.length; i++) {               /* 递归 */              compress(files[i], out, basedir + dir.getName() + "/");           }       }         /** 压缩一个文件 */      private void compressFile(File file, ZipOutputStream out, String basedir) {           if (!file.exists()) {               return;           }           try {               BufferedInputStream bis = new BufferedInputStream(                       new FileInputStream(file));               ZipEntry entry = new ZipEntry(basedir + file.getName());               out.putNextEntry(entry);               int count;               byte data[] = new byte[BUFFER];               while ((count = bis.read(data, 0, BUFFER)) != -1) {                   out.write(data, 0, count);               }               bis.close();           } catch (Exception e) {               throw new RuntimeException(e);           }       }   } 
  • 可以用ant中的org.apache.tools.ant.taskdefs.Zip来实现,更加简单
public class ZipCompressorByAnt {         private File zipFile;         public ZipCompressorByAnt(String pathName) {           zipFile = new File(pathName);       }              public void compress(String srcPathName) {           File srcdir = new File(srcPathName);           if (!srcdir.exists())               throw new RuntimeException(srcPathName + "不存在!");                      Project prj = new Project();           Zip zip = new Zip();           zip.setProject(prj);           zip.setDestFile(zipFile);           FileSet fileSet = new FileSet();           fileSet.setProject(prj);           fileSet.setDir(srcdir);           //fileSet.setIncludes("**/*.java"); 包括哪些文件或文件夹 eg:zip.setIncludes("*.java");           //fileSet.setExcludes(...); 排除哪些文件或文件夹           zip.addFileset(fileSet);                      zip.execute();       }   }  测试一下 Java代码package net.szh.zip;     public class TestZip {       public static void main(String[] args) {           ZipCompressor zc = new  ZipCompressor("E:\\szhzip.zip");           zc.compress("E:\\test");                      ZipCompressorByAnt zca = new ZipCompressorByAnt("E:\\szhzipant.zip");           zca.compress("E:\\test");       }   }  

 

java实现zip压缩文件