`
yuanhuiwu
  • 浏览: 87222 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java调用ant进行压缩和解压

    博客分类:
  • ant
阅读更多

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.util.Enumeration;

import org.apache.log4j.Logger;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;

/**
 * zip工具
 * 
 * @author yuanhuiwu
 * 
 */
public class ZipUtils {
	private static Logger log = Logger.getLogger(ZipUtils.class);
	private static final int BUFFER_SIZE = 8 * 1024;

	/**
	 * @param source
	 *            zip源文件
	 * @param dest
	 *            解压保存的目录
	 * @throws IOException
	 *             IO异常
	 */
	public static void unzip(File source, File dest) throws IOException {
		ZipFile zipFile = null;
		try {
			zipFile = new ZipFile(source);
			unzip(zipFile, dest);
		} finally {
			if (zipFile != null) {
				zipFile.close(); // 关闭文件
			}
		}
	}

	/**
	 * 解压zip文件
	 * 
	 * @param source
	 *            zip 源文件
	 * @param dest
	 *            输出目录
	 * @throws IOException
	 *             IO异常
	 */
	@SuppressWarnings("unchecked")
	private static void unzip(ZipFile source, File dest) throws IOException {

		// 创建目录
		if (!dest.exists()) { // 不存在
			dest.mkdirs(); // 创建
		}
		Enumeration<ZipEntry> en = source.getEntries(); // 返回所有条目 Returns all

		while (en.hasMoreElements()) {
			ZipEntry zipEntry = en.nextElement();

			if (zipEntry.isDirectory()) {// 目录,则创建
				File dir = new File(dest, zipEntry.getName());
				if (!dir.exists()) {
					dir.mkdirs();
					dir = null;
				}
				continue;
			}
			// 创建文件
			File file = new File(dest, zipEntry.getName());
			if (file.exists()) {
				file.delete();
			} else if (!file.getParentFile().exists()) {
				file.getParentFile().mkdirs();
			}
			// end 创建文件
			// 写入
			InputStream in = null;
			FileOutputStream out = null;
			try {
				in = source.getInputStream(zipEntry);
				out = new FileOutputStream(file);
				copy(in, out);
			} finally {// 每次写入后都要关闭流,防止占用资源,导致不能其它操作(如删除该文件)!!!!!!
				file = null;
				if (in != null) {
					in.close();
				}
				if (out != null) {
					out.close();
				}
			}
		}
	}

	/**
	 * @param in
	 *            输入流
	 * @param out
	 *            输出流
	 * @throws IOException
	 *             IO异常
	 */
	private static void copy(InputStream in, OutputStream out)
			throws IOException {
		try {
			byte[] buffer = new byte[BUFFER_SIZE];
			int count = 0;
			do {
				if (count != 0) {
					out.write(buffer, 0, count);
				}
				count = in.read(buffer, 0, buffer.length);
			} while (count != -1);
		} finally {
			if (out != null) {
				out.flush();
			}
		}
	}

	/**
	 * 压缩成zip格式
	 * 
	 * @param source
	 *            源文件或文件夹
	 * @param dest
	 *            输出的zip文件
	 * @throws IOException
	 *             IO异常
	 */
	public static void zip(File source,File dest) throws IOException {
		ZipOutputStream out = null;
		FileOutputStream fos = null;
		try {
			if (!dest.getParentFile().exists()) {
				dest.getParentFile().mkdirs();
			}
			if(dest.exists()){
				dest.delete();
			}
			dest.createNewFile();
			
			fos = new FileOutputStream(dest);
			out = new ZipOutputStream(fos);
			// out.setMethod(ZipOutputStream.DEFLATED);
			// out.setLevel(Deflater.BEST_COMPRESSION);
			zip(out, source, null);
		} finally {
			if (out != null) {
				out.close();
			}
			if (fos != null) {
				fos.close();
			}
		}
	}

	/**
	 * 压缩成zip格式
	 * 
	 * @param out
	 *            ZipOutputStream
	 * @param source
	 *            File
	 * @param vpath
	 *            String
	 * @throws IOException
	 *             IO异常
	 */
	private static void zip(ZipOutputStream out, File source, String vpath)
			throws IOException {
		if (source.isDirectory()) { // 目录
			if(vpath == null){
				vpath = source.getName()+"/";
			}else{
				vpath = vpath +"/";
			}
			out.putNextEntry(new ZipEntry(vpath)); // 格式如:dir/
			File[] files = source.listFiles();
			for (int i = 0; i < files.length; i++) {
				zip(out, files[i], vpath + files[i].getName()); // 递归
			}
		} else {// 文件
			if(vpath == null){
				vpath = source.getName();
			}
			ZipEntry ze = new ZipEntry(vpath);
			// ze.setMethod(ZipEntry.DEFLATED);
			out.putNextEntry(ze);

			FileInputStream in = null;
			try {
				in = new FileInputStream(source);
				copy(in, out);
			} finally {
				if (in != null) {
					in.close();
				}
			}
		}
	}
//
//	public static void unzip2(File source, File dest) {
//		Project prj = new Project();
//		Expand expand = new Expand();
//		expand.setProject(prj);
//		expand.setSrc(source);
//		expand.setDest(dest);
//		expand.execute();
//	}
//
//	public static void zip2(File dest, File source) {
//		Project prj = new Project();
//		Zip zip = new Zip();
//		zip.setProject(prj);
//		zip.setDestFile(dest);
//		FileSet fileSet = new FileSet();
//		fileSet.setProject(prj);
//		fileSet.setDir(source);
//		fileSet.setDefaultexcludes(false);
//		zip.addFileset(fileSet);
//		zip.execute();
//	}
}

分享到:
评论

相关推荐

    Java操作Ant压缩和解压文件及批量打包Anroid应用

    主要介绍了使用Java操作Ant压缩和解压文件以及批量打包Anroid应用的教程,Ant是一个自动化部署工具,用来处理zip和tar文件非常方便,需要的朋友可以参考下

    解压zip压缩文件,支持多文件目录解压,中文乱码问题

    在使用Java对ZIP压缩文件进行解压的方式中有两种,一种是使用apache提供的ant.jar工具包,但是如果ZIP文件中含有中文名称的文件,在解压后,文件名将出现乱码,另一种是使用Java自身JDK中java.util.zip包下工具类,...

    java zip压缩解压工具解决中文乱码问题

    使用java压缩也解压zip文件方法,解决中文乱码问题。使用java自带的压缩解压算法,会出现中文乱码问题。使用apache io的zip包,有效解决该问题。Ant的压缩解压,也是使用该类。

    JAVA 压缩解压AES

    JAVA 文件夹压缩解压,并使用AES加密源代码,带ant.jar包

    Java压缩/解压缩zip

    使用Java核心API实现单文件/多文件/整个目录的压缩/解压缩功能,由于自带API(1.6)不支持指定编码方式,因此中文会出现乱码(1.7貌似已经支持指定编码方式),所以还写了一个基于ant包的压缩/解压缩代码。

    分离自Ant的ZIP包可解决中文文件名处理问题

    这个名是名离自ant原码的,由于java.util.zip处理中文文件名时有问题可以用这个包代替那个使用就不会有中文问题了,我加了一个ZipTool.java,这个就是一个示例文件和方法打包文件。 &lt;br&gt;特点: 一、自有原码不...

    java解压zip或rar压缩文件(源码和jar包)

    java解压zip或rar压缩文件 包括源码和所需要的jar包:apache ant.jar 和 java-unrar-0.3.jar zip文件解压(要使用apache ant.jar以处理中文乱码) rar文件解压(要使用java-unrar-0.3.jar) 具有处理中文乱码功能 代码...

    java 读取ZIP和RAR压缩包的目录结构

    java ZIP和RAR 压缩包 目录结构。 1.ant.jar 解决java自带zip不能读取中文压缩包的问题; 2.需要安装WINRAR软件,以便解压rar文件,然后获取对应目录; 3.实现在线预览压缩包目录结构的功能;

    java下的rar、zip等压缩、解缩工具

    java本身自带有zip格式的压缩解压api,但是对于含有中文的压缩文件无能为力,好在还有apache的ant可以解决zip文件的中文乱码问题。mucommander是一个可以支持zip、gzip、rar、tar、iso等格式的全能工具,这个包是...

    ant使用基础啊

    要使用ant首先要构建一个ant环境,步骤很简单: 1),安装jdk,设置JAVA_HOME ,PATH ,CLASS_PATH(这些应该是看这篇文章的人应该知道的) 2),下载ant 地址http://www.apache.org/找一个你喜欢的版本,或者干脆最新的版本...

    java压缩使用org.apache.tools.zip包解决中文文件名

    使用我自己包,直接放到WEB-INF\classes下解压即可, 在程序中加上 outf.setEncoding("gbk");即可 下面是我的多个文件压缩成一个的压缩,参考 String zipf="D:\\xxx\\xx\\xxb\\xx\\xz.zip"; //---------修改路径---...

    java压缩demo

    一个我做好的java压缩/解压缩文件的demo,一个ZipHelper类+ant.jar包,解决了压缩或解压缩后中文乱码的问题!,可解压嵌套文件夹,用的过程只需new一个ZipHelper,调用该类方法即可,demo里有详细说明!^_^

    Ant 1.9.2 API (CHM格式)

    主要可以帮助程序员进行java项目的的管理,包括批量编译、部署、文档生成等工作,其用途远不止如此,ant内置了大量的API进行各种文件系统操作,在各种应用服务器中都被广泛应用于程序和资源的部署。 Ant功能强大的...

    tools and ant jar

    tools and ant jar, 用于压缩文件,解压文件的java工具类,使用方法有对应的博客。

    JDK ZipEntry压缩中文文件名乱码解决

    项目中碰到问题.jdk zipEntry 压缩中文文件名乱码 ... 如果仅用到压缩,就加入ant.jar 就导致引入了一些不必要的文件,所以我找到Ant1.8的源码,然后只把需要的那一部分编译打包成了一个jar文件,供大家使用

    解压用到的jar包

    java解压缩要用到的jar包,包含ant-1.6.5.jar和junrar-0.7.jar

    Ant测试所需文件.zip

    本压缩文件解压后生成的解压文件夹即文件用于博客《Ant——使用Ant构建简单Java项目》的试验,博客参见网址:http://blog.csdn.net/gaohuanjie/article/details/40144821

    详解java解压缩zip和rar的工具类使用教程

    详解java解压缩zip和rar的工具类使用教程直接上代码 package decompress;  import java.io.File;  import java.io.FileOutputStream;  import org.apache.tools.ant.Project;  import org.apache.tools.ant...

    thrift初步了解

    下载thrift后使用ant编译需要的jar文件。 cmd, 进入build.xml目录, ant -buildfile build.xml thrift协议protocol: TBinaryProtocol:二进制格式 TCompactProtocol:高效压缩的二进制格式 TDenseProtocol:与...

    新版Android开发教程.rar

    的 Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 • 应用程序框架 支持组件的重用与替换 • Dalvik Dalvik Dalvik Dalvik 虚拟机 专为移动设备优化 • ...

Global site tag (gtag.js) - Google Analytics