JAVA實現zip包壓縮工具類

package com.cm.contract.utill;

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.tools.ant.Project;
import org.apache.tools.ant.taskdefs.Zip;
import org.apache.tools.ant.types.FileSet;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;

/**
 * 壓縮工具類,支持中文編碼,遞歸文件夾壓縮 採用gb2312編碼, 文件路徑採用"C:/aa/aaa.txt"
 * @author FENGWEI
 * @date 2016-6-15
 */
public class ZipUtil {
	private final static String ENCODING = "gb2312";
	private final static String FILESEPARATE = "/";

	/**
	 * @param source 文件路徑
	 * @param zipFileName 壓縮後文件名稱  d:/xxx.zip
	 * 壓縮後的zip文件名稱 壓縮後的目錄組織與windows的zip壓縮的目錄組織相同。
	 *      會根據壓縮的目錄的名稱,在壓縮文件夾中創建一個改名的根目錄,其它壓縮的文件和文件夾都在該目錄下依照原來的文件目錄組織形式
	 */
	public static void ZIP(String source, String zipFileName)
			throws IOException {
		File destFile = new File(zipFileName);
		File srcdir = new File(source);
		if (!srcdir.exists())
			throw new RuntimeException(source + "不存在!");
		Project prj = new Project();
		Zip zip = new Zip();
		zip.setProject(prj);
		zip.setDestFile(destFile);
		FileSet fileSet = new FileSet();
		fileSet.setProject(prj);
		fileSet.setDir(srcdir);
		//fileSet.setIncludes("**/*.java"); 包括哪些文件或文件夾 eg:zip.setIncludes("*.java"); 
		//fileSet.setExcludes(...); 排除哪些文件或文件夾 
		zip.addFileset(fileSet);
		zip.execute();
	}

	/**
	 * zip 壓縮單個文件。 除非有特殊需要,否則請調用ZIP方法來壓縮文件!
	 * @param sourceFileName
	 *            要壓縮的原文件
	 * @param zipFileName
	 *            壓縮後的文件名
	 * @param zipFileName
	 *            壓縮後的文件名
	 * @throws IOException
	 *             拋出文件異常
	 */
	public static void ZIPFile(String sourceFileName, ZipOutputStream zos,
			String tager) throws IOException {
		// System.out.println(tager);
		ZipEntry ze = new ZipEntry(tager);
		zos.putNextEntry(ze);

		// 讀取要壓縮文件並將其添加到壓縮文件中
		FileInputStream fis = new FileInputStream(new File(sourceFileName));
		byte[] bf = new byte[2048];
		int location = 0;
		while ((location = fis.read(bf)) != -1) {
			zos.write(bf, 0, location);
		}
		fis.close();
	}

	/**
	 * 壓縮目錄。 除非有特殊需要,否則請調用ZIP方法來壓縮文件!
	 * 
	 * @param sourceDir
	 *            需要壓縮的目錄位置
	 * @param zos
	 *            壓縮到的zip文件
	 * @param tager
	 *            壓縮到的目標位置
	 * @throws IOException
	 *             壓縮文件的過程中可能會拋出IO異常,請自行處理該異常。
	 */
	public static void ZIPDIR(String sourceDir, ZipOutputStream zos,
			String tager) throws IOException {
		ZipEntry ze = new ZipEntry(tager);
		zos.putNextEntry(ze);
		// 提取要壓縮的文件夾中的所有文件
		File f = new File(sourceDir);
		File[] flist = f.listFiles();
		if (flist != null) {
			// 如果該文件夾下有文件則提取所有的文件進行壓縮
			for (File fsub : flist) {
				if (fsub.isDirectory()) {
					// 如果是目錄則進行目錄壓縮
					ZIPDIR(fsub.getPath(), zos, tager + fsub.getName() + FILESEPARATE);
				} else {
					// 如果是文件,則進行文件壓縮
					ZIPFile(fsub.getPath(), zos, tager + fsub.getName());
				}
			}
		}
	}

	/**
	 * 解壓縮zip文件
	 * 
	 * @param sourceFileName
	 *            要解壓縮的zip文件
	 * @param desDir
	 *            解壓縮到的目錄
	 * @throws IOException
	 *             壓縮文件的過程中可能會拋出IO異常,請自行處理該異常。
	 */
	public static void UnZIP(String sourceFileName, String desDir)
			throws IOException {
		// 創建壓縮文件對象
		ZipFile zf = new ZipFile(new File(sourceFileName),ENCODING);

		// 獲取壓縮文件中的文件枚舉
		Enumeration<ZipEntry> en = zf.getEntries();
		int length = 0;
		byte[] b = new byte[2048];

		// 提取壓縮文件夾中的所有壓縮實例對象
		while (en.hasMoreElements()) {
			ZipEntry ze = en.nextElement();
			// System.out.println("壓縮文件夾中的內容:"+ze.getName());
			// System.out.println("是否是文件夾:"+ze.isDirectory());
			// 創建解壓縮後的文件實例對象
			File f = new File(desDir + ze.getName());
			// System.out.println("解壓後的內容:"+f.getPath());
			// System.out.println("是否是文件夾:"+f.isDirectory());
			// 如果當前壓縮文件中的實例對象是文件夾就在解壓縮後的文件夾中創建該文件夾
			if (ze.isDirectory()) {
				f.mkdirs();
			} else {
				// 如果當前解壓縮文件的父級文件夾沒有創建的話,則創建好父級文件夾
				if (!f.getParentFile().exists()) {
					f.getParentFile().mkdirs();
				}
				// 將當前文件的內容寫入解壓後的文件夾中。
				OutputStream outputStream = new FileOutputStream(f);
				InputStream inputStream = zf.getInputStream(ze);
				while ((length = inputStream.read(b)) > 0)
					outputStream.write(b, 0, length);
					inputStream.close();
					outputStream.close();
			}
		}
		zf.close();
	}

	/**
	 * 測試
	 * @param args
	 */
	public static void main(String args[]) {
		try {
			long starTime = 0;
			long endTime = 0;

//			System.out.println("開始壓縮...");
//			starTime = System.currentTimeMillis();
//			ZIP("d:/系統備份", "d:/系統備份.zip");
//			endTime = System.currentTimeMillis();
//			System.out.println("壓縮完畢!花費時間: " + (endTime - starTime) + " 毫秒!");

			System.out.println("開始解壓...");
			starTime = System.currentTimeMillis();
			UnZIP("d:/系統備份.zip", "d:/測試目錄/");
			endTime = System.currentTimeMillis();
			System.out.println("解壓完畢!花費時間: " + (endTime - starTime) + " 毫秒!");
		} catch (Exception ex) {
			// TODO Auto-generated catch block
			ex.printStackTrace();
		}
	}
}

發佈了27 篇原創文章 · 獲贊 59 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章