JAVA,使用ant-1.6.5,压缩、解压缩辅助类代码

有的时候,需要做文件的压缩、解压缩。

java自身提供了已压缩,解压缩的原生类库。不过有开源代码的话,我一般是选择使用开源类库。

下面就贴一下,我使用ant-1.6.5的zip压缩、解压缩的代码吧。

ZipUtil.java

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.zip.CRC32;

import org.apache.tools.ant.Project;
import org.apache.tools.ant.taskdefs.Expand;
import org.apache.tools.ant.taskdefs.Zip;
import org.apache.tools.ant.types.FileSet;
import org.apache.tools.ant.types.ZipFileSet;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;

/**
 * <p>
 * Title: 压缩、解压缩,辅助类
 * </p>
 *
 * @author mahh
 */
public class ZipUtil {

	// ==========================================================================
	// 压缩文件方法1
	// ==========================================================================
	/**
	 * @Description: 压缩一个文件夹或者一个文件
	 * @param sourceFilePath
	 *            源文件夹或者源文件
	 * @param destZip
	 *            压缩后的zip文件
	 * @author mahh
	 * @since:2015-2-28 上午09:36:32
	 */
	public static void zip1(String sourceFilePath, String destZip) {
		FileUtil.createParentFile(destZip); // 目标文件不存在就创建一个

		Project project = new Project();
		Zip zip = new Zip();
		zip.setProject(project);

		zip.setDestFile(new File(destZip));// 设置生成的目标zip文件File对象
		FileSet fileSet = new FileSet();
		fileSet.setProject(project);

		File sourceFile1 = new File(sourceFilePath);
		if (sourceFile1.isDirectory()) {
			fileSet.setDir(sourceFile1);// 设置将要进行压缩的源文件File对象
			// fileSet.setIncludes("**/*.java"); //包括哪些文件或文件夹,只压缩目录中的所有java文件
			// fileSet.setExcludes("**/*.java"); //排除哪些文件或文件夹,压缩所有的文件,排除java文件
		} else {
			fileSet.setFile(sourceFile1);// 设置将要进行压缩的源文件File对象
		}

		// 增加一个Fileset。 Zip中可以增加多个Fileset
		zip.addFileset(fileSet);

		zip.execute();
	}

	/**
	 * @Description:解压缩
	 * @param sourceZipFilePath
	 *            源压缩文件zip
	 * @param destZipDir
	 *            解压缩到文件夹路径
	 * @return
	 * @author mahh
	 * @since:2015-2-28 下午04:57:28
	 */
	public static void unZip1(String sourceZipFilePath, String destZipDir) {
		FileUtil.createDir(destZipDir);

		Project proejct = new Project();
		Expand expand = new Expand();

		expand.setProject(proejct);
		expand.setSrc(new File(sourceZipFilePath));
		expand.setOverwrite(false);// 是否覆盖
		// 如果不写,非常可能出现解压缩后文件的文件名(包含中文)出现乱码
		expand.setEncoding(System.getProperty("sun.jnu.encoding"));

		File file = new File(destZipDir);
		expand.setDest(file);
		expand.execute();
	}

	// ==========================================================================
	// 压缩文件方法2
	// ==========================================================================
	/**
	 * @Description: 将一组文件压缩到一个压缩文件中
	 * @param list
	 *            一组被压缩的源文件,文件不能是目录
	 * @param destZipFilePath
	 *            生成zip文件绝对路径
	 * @param inZipBasePath
	 *            被压缩文件在zip内,相对路径(如a/b/c),默认在ZIP根目录下。
	 * @return
	 * @author mahh
	 * @since:2015-2-28 下午05:09:33
	 */
	public static File zip2(List<File> list, String destZipFilePath,
			String inZipBasePath) {
		if (inZipBasePath == null) {
			inZipBasePath = "";
		}
		inZipBasePath = buildFilePath(inZipBasePath);
		File zipFile = FileUtil.createNewFile(destZipFilePath);// 目标文件不存在就创建一个

		ZipOutputStream out = null;
		try {
			out = new ZipOutputStream(new FileOutputStream(zipFile));

			for (int i = 0; i < list.size(); i++) {
				File file = list.get(i);
				if (!file.exists()) {
					continue;
				}
				if (file.isDirectory()) {
					doZipFolder(inZipBasePath, out, file);
				} else {
					doZipFile(inZipBasePath, out, file);
				}
			}

			return zipFile;
		} catch (IOException e) {
			throw new RuntimeException(e);
		} finally {
			closeZipOutStream(out);
		}
	}

	/**
	 * @Description: 只压缩一个文件夹自己(不包含文件夹内部内容)
	 */
	private static void doZipFolder(String inZipBasePath, ZipOutputStream out,
			File file) throws IOException {
		ZipEntry ze = new ZipEntry(inZipBasePath + FileUtil.FILE_SEPARATOR
				+ file.getName() + FileUtil.FILE_SEPARATOR);
		ze.setTime(new Date().getTime());
		ze.setSize(0);
		ze.setMethod(ZipEntry.STORED);
		ze.setCrc(new CRC32().getValue());
		ze.setUnixMode(ZipFileSet.DEFAULT_DIR_MODE);
		out.putNextEntry(ze);
	}

	/**
	 * @Description: 压缩一个文件
	 */
	private static void doZipFile(String inZipBasePath, ZipOutputStream out,
			File file) throws IOException {
		FileInputStream in = new FileInputStream(file);
		out.putNextEntry(new ZipEntry(inZipBasePath + FileUtil.FILE_SEPARATOR
				+ file.getName()));
		byte[] buf = new byte[1024];
		int len;
		while ((len = in.read(buf)) > 0) {
			out.write(buf, 0, len);
		}
		if (in != null) {
			in.close();
		}
	}

	private static void closeZipOutStream(ZipOutputStream out) {
		if (out == null) {
			return;
		}
		try {
			out.closeEntry();
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
		try {
			out.close();
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * @Description: 返回字符串去除结尾的\或/
	 * @param path
	 * @return
	 * @author mahh
	 * @since:2015-2-28 上午10:36:31
	 */
	private static String buildFilePath(final String path) {
		if (path == null) {
			return "";
		}
		String retStr = path;
		while (FileUtil.isFolderPath(retStr)) {
			if (retStr.length() < 1) {
				break;
			}
			retStr = retStr.substring(0, retStr.length() - 1);
		}
		return retStr;
	}

	// ==========================================================================
	// 解压缩文件方法2
	// ==========================================================================
	/**
	 * @Description:解压缩
	 * @param sourceZipFilePath
	 *            源压缩文件zip
	 * @param destZipDir
	 *            解压缩到文件夹路径
	 * @return
	 * @author mahh
	 * @since:2015-2-28 下午03:47:26
	 */
	@SuppressWarnings("unchecked")
	public static List<File> unZip2(String sourceZipFilePath, String destZipDir) {
		List<File> res = new ArrayList<File>();
		ZipFile zipFile = null;
		try {
			zipFile = new ZipFile(sourceZipFilePath);
			java.util.Enumeration<ZipEntry> ele = zipFile.getEntries();
			while (ele.hasMoreElements()) {
				ZipEntry zipEntry = (ZipEntry) ele.nextElement();
				File f = null;
				if (FileUtil.isFolderPath(zipEntry.getName())) {
					// 解压缩一个文件夹
					f = doUnZipFolder(destZipDir, zipFile, zipEntry);
				} else {
					// 解压缩一个文件
					f = doUnZipFile(destZipDir, zipFile, zipEntry);
				}
				res.add(f);
			}
		} catch (Exception e) {
			throw new RuntimeException("{{不是可用的zip文件!}}");
		} finally {
			try {
				if (zipFile != null) {
					zipFile.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return res;
	}

	/**
	 * @Description: 解压缩一个文件夹自己(不包含文件夹内部内容)
	 */
	private static File doUnZipFolder(String destZipDir, ZipFile zipFile,
			ZipEntry zipEntry) throws IOException {
		File f = FileUtil.createNewFile(destZipDir + FileUtil.FILE_SEPARATOR
				+ zipEntry.getName());
		return f;
	}

	/**
	 * @Description: 解压缩一个文件
	 */
	private static File doUnZipFile(String destZipDir, ZipFile zipFile,
			ZipEntry zipEntry) throws IOException {
		File f = null;
		InputStream in = null;
		FileOutputStream out = null;
		try {
			f = FileUtil.createNewFile(destZipDir + FileUtil.FILE_SEPARATOR
					+ zipEntry.getName());
			in = zipFile.getInputStream(zipEntry);
			out = new FileOutputStream(f);
			byte[] by = new byte[100000];
			int c;
			while ((c = in.read(by)) != -1) {
				out.write(by, 0, c);
			}
			out.flush();
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		} finally {
			if (in != null) {
				in.close(); // 解压完成后注意关闭输入流对象
			}
			if (out != null) {
				out.close(); // 解压完成后注意关闭输出流对象
			}
		}
		return f;
	}

}

FileUtil.java

import java.io.File;
import java.io.IOException;

/**
 * <p>
 * Title: 创建文件、文件夹工具类
 * </p>
 *
 * @author mahh
 *
 */
public class FileUtil {
	/**
	 * 操作系统路径分割符
	 */
	public static final String FILE_SEPARATOR = System
			.getProperty("file.separator");

	/**
	 * @Description: 创建文件(自动创建路径不存在的文件夹)。
	 * @param path
	 *            文件路径
	 * @return
	 * @author mahh
	 * @since:2015-2-28 下午02:23:29
	 */
	public static File createNewFile(String path) {
		File file = new File(path);

		// 如果是以目录分隔符结尾,那么这个路径是一个文件夹
		if (isFolderPath(path)) {
			if (!file.exists()) {
				file.mkdirs();
			}
			return file;
		}

		if (file.exists()) {
			return file;
		}

		String absolutePath = file.getAbsolutePath();
		// 创建文件上层目录
		createDir(absolutePath.substring(0,
				absolutePath.lastIndexOf(FILE_SEPARATOR)));
		try {
			// 创建文件
			file.createNewFile();
		} catch (IOException e) {
			e.printStackTrace();
			throw new RuntimeException();
		}
		return file;
	}

	public static void createParentFile(String path) {
		File file = new File(path);

		String absolutePath = file.getAbsolutePath();
		// 创建文件上层目录
		createDir(absolutePath.substring(0,
				absolutePath.lastIndexOf(FILE_SEPARATOR)));
	}

	/**
	 * @Description: 创建文件夹
	 * @param dir
	 * @author mahh
	 * @since:2015-2-28 下午02:23:40
	 */
	public static void createDir(String dir) {
		File file = new File(dir);
		if (!file.exists()) {
			file.mkdirs();
		}
	}

	/**
	 * @Description: 判断一个字符串是不是文件夹路径
	 * @param path
	 * @return
	 * @author mahh
	 * @since:2015-2-28 上午11:58:35
	 */
	public static boolean isFolderPath(String path) {
		if (path == null) {
			return false;
		}
		if (path.endsWith(FILE_SEPARATOR)) {
			return true;
		}
		if (path.endsWith("/")) {
			return true;
		}
		return false;
	}

}
时间: 2024-11-05 23:19:19

JAVA,使用ant-1.6.5,压缩、解压缩辅助类代码的相关文章

VS 使用ZipFunction压缩解压缩开源代码

SHCreateDirectoryEx 未定义标识符... 要把stdafx.h替换成 // stdafx.h : 标准系统包含文件的包含文件,// 或是经常使用但不常更改的// 特定于项目的包含文件 #pragma once #ifndef _SECURE_ATL#define _SECURE_ATL 1#endif #ifndef VC_EXTRALEAN#define VC_EXTRALEAN // 从 Windows 头中排除极少使用的资料#endif #include "targetv

JAVA压缩 解压缩zip 并解决linux下中文乱码

1. [代码][Java]代码   1:再压缩前,要设置linux模式, 需要使用第三方ant-1.6.5.jar  如果是文件目录,则ZipEntry zipEntry=new ZipEntry(basePath + System.getProperties().getProperty("file.separator"));zipEntry.setUnixMode(755);//解决linux乱码 如果是文件,则 ZipEntry zipEntry=new ZipEntry(base

Huffman 压缩解压缩java实现

Huffman编码的原理这里就不说了,网上随处都是.这里来讲讲利用Huffman编码来进行压缩和解压缩的具体实现吧.本工程使用java实现. 编码 1. 流程图 2. 数据结构 CharacterWeight:记录字符值,以及其在待压缩文件中的权重. Class{ char c; //字符值 int weight; //在文件中权重 String code; //其对应huffman编码 } HuffmanNode:huffman树中的节点信息. Class{ Int parent; //父节点

Java解压缩技术(三)BZIP2压缩-解压缩

Java解压缩技术的实现 GZIP ZIP BZIP2 与GZIP  ZIP 不同的是BZIP2在Java中没有实现,BZIP2的实现是Apache提供的Commons-Compress.jar来实现的 关于 Commons Compress请移步:http://commons.apache.org/proper/commons-compress/ 还是直接上代码 package com.ljh.bzip2; import java.io.ByteArrayInputStream; import

hadoop的压缩解压缩,reduce端join,map端join

hadoop的压缩解压缩 hadoop对于常见的几种压缩算法对于我们的mapreduce都是内置支持,不需要我们关心.经过map之后,数据会产生输出经过shuffle,这个时候的shuffle过程特别需要消耗网络资源,它传输的数据量越少,对作业的运行时间越有意义,在这种情况下,我们可以对输出进行一个压缩.输出压缩之后,reducer就要接收,然后再解压,reducer处理完之后也需要做输出,也可以做压缩.对于我们程序而言,输入的压缩是我们原来的,不是程序决定的,因为输入源就是这样子,reduce

BWT 压缩解压缩算法介绍 poj 1147

poj上1147题, 题意:任意一个长度为N的字符串,循环左移一个字符长度,这样形成N个新字符串,将这N个字符串按字典顺序排序,从上到下取得排序后的每行最后一列的的所有字符,求排序后的第一行字符串? 举个简单例子: 原串为: 0 0 0 1 1 那么循环左移排序后的矩阵为: 0 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 0 0 0 1 1 1 0 0 0 那么我们得到最后列的字符串为: 1 0 0 1 0 现在我们只知道最后列的字符串 1 0 0 1 0,让我们求循环左移排序后

大数据技术之压缩解压缩案例

7.10 压缩/解压缩案例 7.10.1 对数据流的压缩和解压缩 CompressionCodec有两个方法可以用于轻松地压缩或解压缩数据.要想对正在被写入一个输出流的数据进行压缩,我们可以使用createOutputStream(OutputStreamout)方法创建一个CompressionOutputStream,将其以压缩格式写入底层的流.相反,要想对从输入流读取而来的数据进行解压缩,则调用createInputStream(InputStreamin)函数,从而获得一个Compres

Linux的压缩/解压缩文件处理 zip &amp; unzip

Linux的压缩/解压缩命令详解及实例 压缩服务器上当前目录的内容为xxx.zip文件 zip -r xxx.zip ./* 解压zip文件到当前目录 unzip filename.zip 另:有些服务器没有安装zip包执行不了zip命令,但基本上都可以用tar命令的,实例如下: tar -zcvf /home/zdzlibs.tar.gz /home/zdz/java/zdzlibs/ 原文地址:https://www.cnblogs.com/huzixia/p/10393289.html

谢烟客---------Linux之压缩解压缩及归档工具的使用

压缩工具 compress/uncompress:  .Z结尾 gzip/gunzip: .gz结尾 bzip2/bunzip2: .bz2结尾 xz/unxz: .xz后缀 压缩及归档工具: zip/unzip 归档工具: tar,cpio(特殊场景) gzip/gunzip/zcat命令 1.LZ77压缩算法 2.压缩比不高:快速.高效 3.压缩/解压缩后删除原文件,为了节约空间 4.纯文本压缩,二进制压缩意义不大 5.压缩目录,-r gzip [OPTIONS...] FILE     -