文档章节

java来实现zip压缩文件或者文件夹

RobertZhou
 RobertZhou
发布于 2015/04/26 11:25
字数 737
阅读 262
收藏 0
三种不错的方法:
1、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();
   }
  }
 }
2、使用org.apache.tools.zip.ZipOutputStream,代码如下,
Java代码:
package net.szh.zip;   
  
import java.io.BufferedInputStream; 
  
import java.io.File;   
import java.io.FileInputStream; 
  
import java.io.FileOutputStream; 
  
import java.util.zip.CRC32;   
import java.util.zip.CheckedOutputStream; 
  
  
import org.apache.tools.zip.ZipEntry; 
  
import 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);   
        }   
    }   
} 
 
3、可以用ant中的org.apache.tools.ant.taskdefs.Zip来实现,更加简单。 


Java代码
package net.szh.zip;   
  
import java.io.File;   
  
import org.apache.tools.ant.Project; 
  
import org.apache.tools.ant.taskdefs.Zip; 
  
import org.apache.tools.ant.types.FileSet; 
  
  
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");   
    }   
}

© 著作权归作者所有

共有 人打赏支持
RobertZhou
粉丝 8
博文 137
码字总数 17031
作品 0
广州
程序员
私信 提问
Windows不能用鼠标双击运行jar文件怎么

Java应用程序jar文件可以由 JVM(Java虚拟机)直接执行,只要操作系统安装了JVM便可以运行作为Java应用程序的jar文件,其跨平台特性使得很多工具软件都用jar方式来部署分发,比如用于HP WebO...

java-苦苦甜甜
2013/06/26
0
0
向ZIP包追加文件,无需解压

向zip包中追加文件,不需要常规的解压到临时文件后追加,然后再压缩,必须在压缩状态追加一个文件,能java实现或者借助小软件java实现也行,有谁知道啊?

java软件工程师上海
2014/11/13
1K
1
Docker, Java EE 7, 和 Maven with WebLogic 12.1.3

WebLogic 12.1.3 已经发布了,这个版本包括了Java EE7里对数据库的Web应用开发最为重要的API,以下是这个版本支持的部分规范: Java Persistence API 2.1 (使用EclipseLink实现) JAX-RS 2.0 ...

oschina
2014/07/02
4.9K
6
自己总结的几个常见问题的解决方法

希望对你有帮助: 1、安装jdk之后做什么就可以写helloworld了? 答:设定Path环境变量暴露javac和java即可。 做法: 将jdk目录/bin设定添加到Path环境变量里去。 windows中环境变量配好之后要...

精华之王
2009/04/11
244
0
linux C zip 压缩 字符串

项目需要通过zip压缩进行数据传输,linux c为客户端,java为服务端,通过TCP发送,目前已实现java版本的zip压缩解压缩。 现在还需要实现C客户端的zip压缩。 尝试使用zlib的compress,长度不一...

bigbear1007
2016/02/17
864
2

没有更多内容

加载失败,请刷新页面

加载更多

RestClientUtil和ConfigRestClientUtil区别说明

RestClientUtil directly executes the DSL defined in the code. ConfigRestClientUtil gets the DSL defined in the configuration file by the DSL name and executes it. RestClientUtil......

bboss
今天
11
0

中国龙-扬科
昨天
2
0
Linux系统设置全局的默认网络代理

更改全局配置文件/etc/profile all_proxy="all_proxy=socks://rahowviahva.ml:80/"ftp_proxy="ftp_proxy=http://rahowviahva.ml:80/"http_proxy="http_proxy=http://rahowviahva.ml:80/"......

临江仙卜算子
昨天
9
0
java框架学习日志-6(bean作用域和自动装配)

本章补充bean的作用域和自动装配 bean作用域 之前提到可以用scope来设置单例模式 <bean id="type" class="cn.dota2.tpye.Type" scope="singleton"></bean> 除此之外还有几种用法 singleton:......

白话
昨天
8
0
在PC上测试移动端网站和模拟手机浏览器的5大方法

总结很全面,保存下来以备不时之需。原文地址:https://www.cnblogs.com/coolfeng/p/4708942.html

kitty1116
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部