日期:2014-05-16  浏览次数:21013 次

利用apache ant 包进行压缩、解压缩zip,归档tar,解档tar,压缩tar.gz解压tar.gz
最近用到了利用java进行一序列压缩解压缩,jdk也自带了,这里我就不用它了。本例用到的开源包是apahce ant.jar。我上传了。希望对大家有帮组。
引用
Java压缩zip,解压缩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 java.util.zip.CRC32;
import java.util.zip.CheckedOutputStream;

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;


/**
 * 利用Apache ant.jar中的zip包进行Zip压缩和解压
 */
public class XZouZip {
	/**
	 * 测试压缩
	 */
	public void testZip(){
		
		File srcFile = new File("c:/upload");//要压缩的文件对象
		
		File targetZipFile = new File("c:/upload.zip");//压缩后的文件名
		
		ZipOutputStream out = null;
		
		boolean boo = false;//是否压缩成功
		
		try{
			
			CheckedOutputStream cos = new CheckedOutputStream(new FileOutputStream(
					targetZipFile), new CRC32());
			 out = new ZipOutputStream(cos);
			
			//out = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream("c:/uploadd.zip")));
			
			zip(srcFile, out, "", true);
			
			boo = true;
			
		}catch(IOException ex){
			throw new RuntimeException(ex);
		}finally{
			
			try{
				if(out!=null)
					out.close();
			}catch(IOException ex){
				throw new RuntimeException("关闭Zip输出流出现异常",ex);
			}finally{
				//清理操作
				if(!boo && targetZipFile.exists())//压缩不成功,
					targetZipFile.delete();
			}
			
		}

	}
	
	/**
	 * 测试解压缩
	 */
	public void testUnZip(){
		
		File srcZipFile = new File("c:/upload.zip");//要解压缩的zip文件对象
		
		String destDir = "c:/a";//将解压文件对象放置a目录中
		
		boolean boo = false;//是否压缩成功
		
		try {
			unZip(srcZipFile,destDir);
			boo = true;
		} catch (IOException e) {
			throw new RuntimeException(e);
		}finally{
			//清理操作
			if(!boo)
				deleteDirectory(new File(destDir));//目标文件夹 。清理
			
		}
		
	}
	public static void main(String[] args) throws IOException {
		
		XZouZip tool = new XZouZip();
		
		tool.testZip();
		
		//tool.testUnZip();
		
		
	}
	
	
	
	/**
	 * 压缩zip文件
	 * @param file 压缩的文件对象
	 * @param out 输出ZIP流
	 * @param dir 相对父目录名称
	 * @param boo 是否把空目录压缩进去
	 */
	public void zip(File file,ZipOutputStream out,String dir,boolean boo) throws IOException{
		
		if(file.isDirectory()){//是目录
			
			File []listFile = file.listFiles();//得出目录下所有的文件对象
			
			if(listFile.length == 0 && boo){//空目录压缩
				
				out.putNextEntry(new ZipEntry(dir + file.getName() + "/"));//将实体放入输出ZIP流中
				System.out.println("压缩." + dir + file.getName() + "/");
				return;
			}else{
				
				for(File cfile: listFile){
					
					zip(cfile,out,dir + file.getName() + "/",boo);//递归压缩
				}
			}
			
		}else if(file.isFile()){//是文件
			
			System.out.println("压缩." + dir + file.getName() + "/");
			
			byte[] bt = new byte[2048*2];
			
            ZipEntry ze = new ZipEntry(dir+file.getName());//构建压缩实体
            //设置压缩前的文件大小
            ze.setSize(file.length());
            
            out.putNextEntry(ze);////将实体放入输出ZIP流中
            
            FileInputStream fis = null;
            
            try{
            	
            	fis = new FileInputStream(file);
            	
            	int i=0;
                
                while((i = fis.read(bt)) != -1) {//循环读出并写入输出Zip流中
  
                    out.write(bt, 0, i);
                }
            	
            }catch(IOException ex){
            	throw new IOException("写入压缩文件出现异常",ex);
            }finally{
            	
            	try{
            		if (fis != null)
            			fis.close();//关闭输入流
            		
            	}catch(IOException ex){
            		
            		throw new IOException("关闭输入流出现异常");
            	}

            }           
		}
		
	}
	
	/**
	 * 解压缩zipFile
	 * @param file 要解压的zip文件对象
	 * @param outputDir 要解压到某个指定的目录下
	 * @throws IOException
	 */
	public void unZip(File file,String outputDir) throws I