java压缩文件

package org.liufei.net.util;

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;

/**
 * 
 * @author 刘飞
 * 
 */
public class JavaZip {
	private static final Logger logger = Logger.getLogger(JavaZip.class);

	/**
	 * 压缩文件file成zip文件zipFile
	 * 
	 * @param file
	 *            要压缩的文件
	 * @param zipFile
	 *            压缩文件存放地方
	 * @throws IOException
	 */

	public static void zip(File file, File zipFile) {

		ZipOutputStream output = null;
		try {
			output = new ZipOutputStream(new FileOutputStream(zipFile));
			/**
			 * 顶层目录开始
			 */
			zipFile(output, file, "");
		} catch (IOException ex) {
			logger.error("zip file [ " + file + " ] error.", ex);
			throw new RuntimeException("zip file [ " + file + " ] error.", ex);
		} finally {
			try {
				/**
				 * 关闭流
				 */
				if (output != null) {
					output.flush();
					output.close();
				}
			} catch (IOException e) {
				logger.error("close ZipOutputStream [ file : " + zipFile
						+ " ] error.", e);
				throw new RuntimeException("zip file [ " + zipFile
						+ " ] error.", e);
			}
		}
	}

	/**
	 * 压缩文件为zip格式
	 * 
	 * @param output
	 *            ZipOutputStream对象
	 * @param file
	 *            要压缩的文件或文件夹
	 * @param basePath
	 *            条目根目录
	 * @throws IOException
	 */
	private static void zipFile(ZipOutputStream output, File file,
			String basePath) throws IOException {
		FileInputStream input = null;
		try {
			/**
			 * 文件为目录
			 */
			if (file.isDirectory()) {
				/**
				 * 得到当前目录里面的文件列表
				 */
				File list[] = file.listFiles();
				basePath = basePath + (basePath.length() == 0 ? "" : "/")
						+ file.getName();
				/**
				 * 循环递归压缩每个文件
				 */
				for (File f : list)
					zipFile(output, f, basePath);
			} else {
				/**
				 * 压缩文件
				 */
				basePath = (basePath.length() == 0 ? "" : basePath + "/")
						+ file.getName();
				output.putNextEntry(new ZipEntry(basePath));
				input = new FileInputStream(file);
				int readLen = 0;
				byte[] buffer = new byte[1024 * 8];
				while ((readLen = input.read(buffer, 0, 1024 * 8)) != -1)
					output.write(buffer, 0, readLen);
			}
		} catch (Exception ex) {
			logger.error("zip file [ " + file + " ] error.", ex);
			throw new RuntimeException("zip file [ " + file + " ] error.", ex);
		} finally {
			/**
			 * 关闭流
			 */
			if (input != null)
				input.close();
		}
	}

	/**
	 * 解压zip文件
	 * 
	 * @param zip
	 *            zip文件绝对路径
	 * @param unZipDir
	 *            解压到的目录
	 * @throws IOException
	 */
	public static void unZip(String zip, String unZipDir) throws IOException {
		unZip(new File(zip), new File(unZipDir)) ;
	}

	/**
	 * 解压zip文件
	 * 
	 * @param zip
	 *            zip文件
	 * @param unZipDir
	 *            解压到的目录文件
	 * @throws IOException
	 */
	@SuppressWarnings("unchecked")
	public static void unZip(File zip, File unZipDir) throws IOException {
		ZipFile zipFile = new ZipFile(zip, "GBK");

		byte[] buffer = new byte[2048];
		int length = -1;

		OutputStream out = null;
		InputStream in = null;

		Enumeration<ZipEntry> zee = zipFile.getEntries();
		while (zee.hasMoreElements()) {
			ZipEntry zipEntry = zee.nextElement();
			File loadFile = new File(unZipDir, zipEntry.getName());

			if (zipEntry.isDirectory()) {
				loadFile.mkdirs();
			} else {
				if (!loadFile.getParentFile().exists()) {
					loadFile.getParentFile().mkdirs();
				}
				out = new FileOutputStream(loadFile, false);

				in = zipFile.getInputStream(zipEntry);

				while ((length = in.read(buffer)) > 0) {
					out.write(buffer, 0, length);
				}
			}
		}

		if (in != null) {
			in.close();
		}
		if (out != null) {
			out.flush();
			out.close();
		}
	}
}

你可能感兴趣的:(java,zip)