现在的位置: 首页 > 综合 > 正文

实现对文件和目录的压缩、解压缩

2012年09月06日 ⁄ 综合 ⁄ 共 3551字 ⁄ 字号 评论关闭
package Util;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

public class ZipUtil {
	private static ZipUtil ziputil=new ZipUtil();
	public static ZipUtil getInstance(){
		return ziputil;
	}

	/**测试用例
	 * @param args
	 */
	public static void main(String[] args) {
		try {
//			ZipUtil.zip(new String[]{"D:\\zip\\TestSub.txt"}, "D:\\zip\\ziptest.zip");
//			ZipUtil.unzip("D:\\zip\\ziptest.zip", "D:\\zip");
//			ZipUtil.getInstance().zip("D:\\zipsource.rar", "D:\\zip");
			ZipUtil.getInstance().unzipDirectory("D:\\zipsource.rar", "D:\\zip");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 文件压缩
	 * @param files 要解压缩的文件
	 * @param destZip 压缩之后的zip文件所放的目录,需要"D:\\"或"D:\\test\"格式
	 * @throws IOException
	 */
	public static void zip(String[] files, String destZip) throws IOException {
		FileOutputStream fos = new FileOutputStream(destZip);
		BufferedOutputStream bos = new BufferedOutputStream(fos);
		ZipOutputStream zos = new ZipOutputStream(bos);

		for (int i = 0; i < files.length; i++) {
			String file = files[i];
			FileInputStream fis = new FileInputStream(file);
			BufferedInputStream bis = new BufferedInputStream(fis);

			File f = new File(file);
			ZipEntry zl = new ZipEntry(f.getName());
			zos.putNextEntry(zl);
			int tmp = -1;
			while ((tmp = bis.read()) != -1) {
				zos.write(tmp);
			}
			zos.closeEntry();
			bis.close();
			fis.close();
		}

		zos.close();
		bos.close();
		fos.close();
	}
	/**
	 * 文件解压缩
	 * @param zipfile 要解压缩的zip文件
	 * @param destpath 解压后文件所放的目录,需要“D:\\”或“D:\\test”格式
	 * @throws IOException 
	 */
	public static void unzip(String zipfile,String destpath) throws IOException{
		FileInputStream fis=new FileInputStream(zipfile);
		ZipInputStream zis=new ZipInputStream(fis);
		ZipEntry zl=null;
		while((zl=zis.getNextEntry())!=null){
			if(zl.isDirectory()){
//				destpath+="\\"+zl.getName();
				File f=new File(destpath+"\\"+zl.getName());
				f.mkdirs();
			}else{
				String file=zl.getName();
				FileOutputStream fos=new FileOutputStream(destpath+"\\"+file);
				int tmp=-1;
				while((tmp=zis.read())!=-1)
				{
					fos.write(tmp);
				}
				zis.closeEntry();
				fos.close();
			}
		}
		zis.close();
	}
	/**
	 * 压缩目录
	 * @param zipFileName 压缩后zip文件的路径
	 * @param inputFile 需要压缩的源目录
	 * @throws IOException
	 */
	public void zip(String zipFileName,String inputFile) throws IOException{
		File file=new File(inputFile);
		ZipOutputStream out=new ZipOutputStream(new FileOutputStream(zipFileName));
		zip(out,file,"");
		System.out.println("zip done");
		out.close();
	}
	/**
	 *递归遍历子目录和文件,进行压缩
	 * @param out
	 * @param f
	 * @param base
	 * @throws IOException
	 */
	private void zip(ZipOutputStream out, File f, String base) throws IOException {
		System.out.println("Zipping"+f.getName());
		if(f.isDirectory()){
			File[] fl=f.listFiles();
			out.putNextEntry(new ZipEntry(base+"/"));
			base=base.length()==0?"":base+"/";
			for(int i=0;i<fl.length;i++){
				zip(out,fl[i],base+fl[i].getName());
			}
		}else{
			out.putNextEntry(new ZipEntry(base));
			FileInputStream in=new FileInputStream(f);
			int b;
			while((b=in.read())!=-1){
				out.write(b);
			}
			in.close();
		}
	}
	/**
	 * 解压缩目录
	 * @param zipFileName 需要压缩的文件
	 * @param outputDirectory 解压缩后文件所放路径
	 * @throws Exception
	 */
	public void unzipDirectory(String zipFileName,String outputDirectory) throws Exception{
		ZipInputStream in=new ZipInputStream(new FileInputStream(zipFileName));
		ZipEntry z;
		while((z=in.getNextEntry())!=null){
			System.out.println("unziping "+z.getName());
			if(z.isDirectory()){
				String name=z.getName();
				name=name.substring(0, name.length()-1);
				File f=new File(outputDirectory+File.separator+name);
				f.mkdirs();
				System.out.println("mkdir "+outputDirectory+File.separator+name);
			}else{
				File f=new File(outputDirectory+File.separator+z.getName());
				f.createNewFile();
				FileOutputStream out=new FileOutputStream(f);
				int b;
				while((b=in.read())!=-1){
					out.write(b);
				}
				out.close();
			}
		}
		in.close();
	}
	
}

抱歉!评论已关闭.