java基礎之zip(壓縮、解壓)

本程序依賴第三方包Ant.jar。因爲java自帶的java.utils.zip.ZipOutputStream對一些敏感中文路徑會拋出異常。

package javax.zip;

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.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;

/**
 * @author hubiao
 * 	zip文件:壓縮、解壓
 * 		[支持中文路徑]
 * 		用到工具類jar:org.apache.tools.zip.*
 */
@SuppressWarnings("unchecked")
public class ZIPUtils{
	public static void main(String[] args) throws Exception {
		/*壓縮*/
		Compression(new File("F:\\aaaa"),null);
		
		/*解壓*/
	//	Decompression(null,"F://aaaa.zip");
		
		//ZipOutputStream zos = new ZipOutputStream(os,Charset.forName("GBK"));//解決中文路徑
	}
	/**
	 * 	遞歸打包成zip
	 * @param outPut  zip輸出流
	 * @param listFiles	目錄子文件
	 * @param fuPath	父級目錄名稱
	 * @throws Exception
	 */
	private static void createZip(org.apache.tools.zip.ZipOutputStream outPut,File[] listFiles,String fuPath) throws Exception {
		for(File f : listFiles)
		{
			String name = fuPath==null?f.getName():fuPath+"/"+f.getName();;
			if(f.isDirectory())
			{
				System.out.println("創建目錄["+name+"]");
				outPut.putNextEntry(new ZipEntry(name+"/"));//這個/一定要加,不然無法創建文件夾咯!
				createZip(outPut,f.listFiles(),name);
			}else{
				System.out.println("創建文件["+name+"]");
				outPut.putNextEntry(new ZipEntry(name));
				InputStream is = new FileInputStream(f);
				byte[] bys = new byte[1024];
				int len = 0;
				while((len = is.read(bys))!=-1)
					outPut.write(bys, 0, len);
				is.close();
				outPut.flush();
			}
		}
	}
	/**
	 * 	解壓文件
	 * @param savePath	解壓保存路徑
	 * @param targetFile zip源文件路徑
	 * @throws IOException 解壓錯誤
	 */
	private static void Decompression(String savePath, String target) throws IOException {
		long start = System.currentTimeMillis();
		//設置根路徑或默認路徑(解決路徑含有  xx\xxx | aa/aaa )
		File targetFile = new File(target);
		//默認保存路徑
		if(savePath==null)
			savePath = targetFile.toString().substring(0, targetFile.toString().lastIndexOf("."));
		else
			savePath = savePath.concat(targetFile.toString().substring(targetFile.toString().lastIndexOf("\\"), targetFile.toString().lastIndexOf(".")));
		
		//遍歷所有zip文件
		ZipFile zipFile = new ZipFile(targetFile);
		Enumeration<ZipEntry> entries = zipFile.getEntries();
		OutputStream os = null;
		while(entries.hasMoreElements())
		{
			ZipEntry ze = entries.nextElement();
			String name = ze.getName();
			InputStream is = zipFile.getInputStream(ze);
			//創建文件夾
			int last = name.lastIndexOf("/");
			File destFile = null;
			if(last!=-1){
				destFile = new File(savePath,name.substring(0,last));
				destFile.mkdirs();
				if(name.indexOf(".")==-1)
					continue;
				destFile = new File(destFile,name.substring(last));//文件夾+文件名稱
			}else{
				destFile = new File(savePath,name);//文件名稱
			}
			System.out.println("正在解壓["+name+"]");
			
			//讀取zip
			byte[] bys = new byte[1024];
			int len = 0;
			os = new FileOutputStream(destFile);
			while((len = is.read(bys))!=-1)
			{
				os.write(bys,0,len);
				os.flush();
			}
			os.close();
		}
		long end = System.currentTimeMillis();
		System.out.println("****************解壓完畢,消耗["+(end-start)+"(ms)];****************");
	}
	/**
	 * @param destDir	被壓縮的目錄
	 * @param target    壓縮保存目錄	
	 * @throws Exception 
	 */
	public static void Compression(File destDir, String saveDir) throws Exception {
		long start = System.currentTimeMillis();
		if(destDir==null || !destDir.exists())
			throw new RuntimeException(destDir.toString()+"  不存在!");
		if(saveDir==null)
			saveDir = destDir.toString()+".zip";
		ZipOutputStream outPut = new ZipOutputStream(new FileOutputStream(new File(saveDir)));
		outPut.setEncoding("GBK");//設置編碼
		createZip(outPut,destDir.listFiles(),null);
		outPut.flush();
		outPut.close();
		long end = System.currentTimeMillis();
		System.out.println("****************壓縮完畢,消耗["+(end-start)+"(ms)];****************");
	}
}
如:壓縮運行結果:

創建目錄[2013]
創建目錄[2013/20130508]
創建文件[2013/20130508/20130508001.jpg]
創建文件[2013/20130508/20130508002.jpg]
創建文件[2013/20130508/20130508003.jpg]
創建文件[2013/20130508/20130508004.jpg]
創建文件[2013/20130508/2013050801.xml]
創建文件[2013/20130508/2013050802 - 副本.xml]
創建文件[2013/20130508/2013050802.xml]
創建文件[2013/20130508/2013050803 - 副本.xml]
創建文件[2013/20130508/2013050803.xml]
創建文件[2013/20130508/2013050804.xml]
創建目錄[2013/20130508/images]
創建文件[2013/20130508/images/20130508011.jpg]
創建文件[2013/20130508/images/20130508021.jpg]
創建文件[2013/20130508/images/20130508041.jpg]
創建文件[2013/20130508/images/201305080410.jpg]
創建文件[2013/20130508/images/201305080411.jpg]
創建文件[2013/20130508/images/201305080412.jpg]
創建文件[2013/20130508/images/201305080413.jpg]
創建文件[2013/20130508/images/20130508042.jpg]
創建文件[2013/20130508/images/20130508043.jpg]
創建文件[2013/20130508/images/20130508044.jpg]
創建文件[2013/20130508/images/20130508045.jpg]
創建文件[2013/20130508/images/20130508046.jpg]
創建文件[2013/20130508/images/20130508047.jpg]
創建文件[2013/20130508/images/20130508048.jpg]
創建文件[2013/20130508/images/20130508049.jpg]
創建目錄[2013/s]
創建文件[2013/s/2013050802.xml]
創建文件[2013/s/2013050803.xml]
創建文件[null/2013050801.xml]
創建文件[null/2013050802 - 副本.xml]
創建目錄[車]
創建目錄[車/要在]
創建目錄[順要要]
創建目錄[順要要/新建文件夾]
創建目錄[順要要/新建文件夾/sfds]
創建目錄[順要要/新建文件夾/sfds/aadf]
創建目錄[順要要/新建文件夾/新建文件夾 - 副本]
創建目錄[順要要/新建文件夾 - 副本]
****************壓縮完畢,消耗[188(ms)];****************






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章