java解压zip与rar

package com.xxx.decompression;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import org.apache.tools.tar.TarEntry;
import org.apache.tools.tar.TarOutputStream;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;

import de.innosystec.unrar.Archive;
import de.innosystec.unrar.exception.RarException;
import de.innosystec.unrar.rarfile.FileHeader;

/** 
 * @author Every E-mail/MSN:[email protected]
 *   QQ:30130942
 * @version 创建时间:Feb 26, 2009 6:01:11 PM 
 * 类说明:压缩、解压文件公用类
 *
 */
public class Decompression {
	private static final int BUFFEREDSIZE = 1024;
	public Decompression() {
		// TODO Auto-generated constructor stub
	}

	/**
     * 解压zip格式的压缩文件到当前文件夹
     * @param zipFileName
     * @throws Exception
     */
    @SuppressWarnings("unchecked")
    public synchronized void unzipFile(String zipFileName) throws Exception {
	    try {
		    File f = new File(zipFileName);
		    ZipFile zipFile = new ZipFile(zipFileName);
		    if((!f.exists()) && (f.length() <= 0)) {
		    	throw new Exception("要解压的文件不存在!");
		    }
		    String strPath, gbkPath, strtemp;
		    File tempFile = new File(f.getParent());
		    strPath = tempFile.getAbsolutePath();
		    java.util.Enumeration e = zipFile.getEntries();
		    while(e.hasMoreElements()){
			    org.apache.tools.zip.ZipEntry zipEnt = (ZipEntry) e.nextElement();
			    gbkPath=zipEnt.getName();
			    if(zipEnt.isDirectory()){
				    strtemp = strPath + "/" + gbkPath;
				    File dir = new File(strtemp);
				    dir.mkdirs();
				    continue;
			    } else {
				    //读写文件
				    InputStream is = zipFile.getInputStream(zipEnt);
				    BufferedInputStream bis = new BufferedInputStream(is);
				    gbkPath=zipEnt.getName();
				    strtemp = strPath + "/" + gbkPath;
				
				    //建目录
				    String strsubdir = gbkPath;
				    for(int i = 0; i < strsubdir.length(); i++) {
					    if(strsubdir.substring(i, i + 1).equalsIgnoreCase("/")) {
						    String temp = strPath + "/" + strsubdir.substring(0, i);
						    File subdir = new File(temp);
						    if(!subdir.exists())
						    subdir.mkdir();
					    }
				    }
				    FileOutputStream fos = new FileOutputStream(strtemp);
				    BufferedOutputStream bos = new BufferedOutputStream(fos);
				    int c;
				    while((c = bis.read()) != -1) {
				    	bos.write((byte) c);
				    }
				    bos.close();
				    fos.close();
			    }
		    }
	    } catch(Exception e) {
		    e.printStackTrace();
		    throw e;
	    }
    }
    
	/**
	 * 解压zip格式的压缩文件到指定位置
	 * @param zipFileName 压缩文件
	 * @param extPlace 解压目录
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public synchronized void unzip(String zipFileName, String extPlace) throws Exception {
		try {
	    	(new File(extPlace)).mkdirs();
		    File f = new File(zipFileName);
		    ZipFile zipFile = new ZipFile(zipFileName);
		    if((!f.exists()) && (f.length() <= 0)) {
		    	throw new Exception("要解压的文件不存在!");
		    }
		    String strPath, gbkPath, strtemp;
		    File tempFile = new File(extPlace);
		    strPath = tempFile.getAbsolutePath();
		    java.util.Enumeration e = zipFile.getEntries();
		    while(e.hasMoreElements()){
			    org.apache.tools.zip.ZipEntry zipEnt = (ZipEntry) e.nextElement();
			    gbkPath=zipEnt.getName();
			    if(zipEnt.isDirectory()){
				    strtemp = strPath + File.separator + gbkPath;
				    File dir = new File(strtemp);
				    dir.mkdirs();
				    continue;
			    } else {
				    //读写文件
				    InputStream is = zipFile.getInputStream(zipEnt);
				    BufferedInputStream bis = new BufferedInputStream(is);
				    gbkPath=zipEnt.getName();
				    strtemp = strPath + File.separator + gbkPath;
				
				    //建目录
				    String strsubdir = gbkPath;
				    for(int i = 0; i < strsubdir.length(); i++) {
					    if(strsubdir.substring(i, i + 1).equalsIgnoreCase("/")) {
						    String temp = strPath + File.separator + strsubdir.substring(0, i);
						    File subdir = new File(temp);
						    if(!subdir.exists())
						    subdir.mkdir();
					    }
				    }
				    FileOutputStream fos = new FileOutputStream(strtemp);
				    BufferedOutputStream bos = new BufferedOutputStream(fos);
				    int c;
				    while((c = bis.read()) != -1) {
				    	bos.write((byte) c);
				    }
				    bos.close();
				    fos.close();
			    }
		    }
	    } catch(Exception e) {
		    e.printStackTrace();
		    throw e;
	    }
	}
	
	/**
	 * 解压zip格式的压缩文件到指定位置
	 * @param zipFileName 压缩文件
	 * @param extPlace 解压目录
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public synchronized void unzip(String zipFileName, String extPlace,boolean whether) throws Exception {
		try {
	    	(new File(extPlace)).mkdirs();
		    File f = new File(zipFileName);
		    ZipFile zipFile = new ZipFile(zipFileName);
		    if((!f.exists()) && (f.length() <= 0)) {
		    	throw new Exception("要解压的文件不存在!");
		    }
		    String strPath, gbkPath, strtemp;
		    File tempFile = new File(extPlace);
		    strPath = tempFile.getAbsolutePath();
		    java.util.Enumeration e = zipFile.getEntries();
		    while(e.hasMoreElements()){
			    org.apache.tools.zip.ZipEntry zipEnt = (ZipEntry) e.nextElement();
			    gbkPath=zipEnt.getName();
			    if(zipEnt.isDirectory()){
				    strtemp = strPath + File.separator + gbkPath;
				    File dir = new File(strtemp);
				    dir.mkdirs();
				    continue;
			    } else {
				    //读写文件
				    InputStream is = zipFile.getInputStream(zipEnt);
				    BufferedInputStream bis = new BufferedInputStream(is);
				    gbkPath=zipEnt.getName();
				    strtemp = strPath + File.separator + gbkPath;
				
				    //建目录
				    String strsubdir = gbkPath;
				    for(int i = 0; i < strsubdir.length(); i++) {
					    if(strsubdir.substring(i, i + 1).equalsIgnoreCase("/")) {
						    String temp = strPath + File.separator + strsubdir.substring(0, i);
						    File subdir = new File(temp);
						    if(!subdir.exists())
						    subdir.mkdir();
					    }
				    }
				    FileOutputStream fos = new FileOutputStream(strtemp);
				    BufferedOutputStream bos = new BufferedOutputStream(fos);
				    int c;
				    while((c = bis.read()) != -1) {
				    	bos.write((byte) c);
				    }
				    bos.close();
				    fos.close();
			    }
		    }
	    } catch(Exception e) {
		    e.printStackTrace();
		    throw e;
	    }
	}
	/**
	 * 压缩zip格式的压缩文件
	 * @param inputFilename 压缩的文件或文件夹及详细路径
	 * @param zipFilename 输出文件名称及详细路径
	 * @throws IOException
	 */
	public synchronized void zip(String inputFilename, String zipFilename) throws IOException {
		zip(new File(inputFilename), zipFilename);
	}
	
	/**
	 * 压缩zip格式的压缩文件
	 * @param inputFile 需压缩文件
	 * @param zipFilename 输出文件及详细路径
	 * @throws IOException
	 */
	public synchronized void zip(File inputFile, String zipFilename) throws IOException {
		ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFilename));
		try {
			zip(inputFile, out, "");
		} catch (IOException e) {
			throw e;
		} finally {
			out.close();
		}
	}
	
	/**
	 * 压缩zip格式的压缩文件
	 * @param inputFile 需压缩文件
	 * @param out 输出压缩文件
	 * @param base 结束标识
	 * @throws IOException
	 */
	@SuppressWarnings("unused")
	private synchronized void zip(File inputFile, ZipOutputStream out, String base) throws IOException {
		if (inputFile.isDirectory()) {
			File[] inputFiles = inputFile.listFiles();
			out.putNextEntry(new ZipEntry(base + "/"));
			base = base.length() == 0 ? "" : base + "/";
			for (int i = 0; i < inputFiles.length; i++) {
				zip(inputFiles[i], out, base + inputFiles[i].getName());
			}
		} else {
			if (base.length() > 0) {
				out.putNextEntry(new ZipEntry(base));
			} else {
				out.putNextEntry(new ZipEntry(inputFile.getName()));
			}
			FileInputStream in = new FileInputStream(inputFile);
			try {
				int c;
				byte[] by = new byte[BUFFEREDSIZE];
				while ((c = in.read(by)) != -1) {
					out.write(by, 0, c);
				}
			} catch (IOException e) {
				throw e;
			} finally {
				in.close();
			}
		}
	}

	
    /**
     * 解压tar格式的压缩文件到指定目录下
     * @param tarFileName 压缩文件
     * @param extPlace 解压目录
     * @throws Exception
     */
	public synchronized void untar(String tarFileName, String extPlace) throws Exception{
		
	}
	
	/**
	 * 压缩tar格式的压缩文件
	 * @param inputFilename 压缩文件
	 * @param tarFilename 输出路径
	 * @throws IOException
	 */
	public synchronized void tar(String inputFilename, String tarFilename) throws IOException{
		tar(new File(inputFilename), tarFilename);
	}
	
	/**
	 * 压缩tar格式的压缩文件
	 * @param inputFile 压缩文件
	 * @param tarFilename 输出路径
	 * @throws IOException
	 */
	public synchronized void tar(File inputFile, String tarFilename) throws IOException{
		TarOutputStream out = new TarOutputStream(new FileOutputStream(tarFilename));
		try {
			tar(inputFile, out, "");
		} catch (IOException e) {
			throw e;
		} finally {
			out.close();
		}
	}
	
	/**
	 * 压缩tar格式的压缩文件
	 * @param inputFile 压缩文件
	 * @param out 输出文件 
	 * @param base 结束标识
	 * @throws IOException
	 */
	@SuppressWarnings("unused")
	private synchronized void tar(File inputFile, TarOutputStream out, String base) throws IOException {
		if (inputFile.isDirectory()) {
			File[] inputFiles = inputFile.listFiles();
			out.putNextEntry(new TarEntry(base + "/"));
			base = base.length() == 0 ? "" : base + "/";
			for (int i = 0; i < inputFiles.length; i++) {
				tar(inputFiles[i], out, base + inputFiles[i].getName());
			}
		} else {
			if (base.length() > 0) {
				out.putNextEntry(new TarEntry(base));
			} else {
				out.putNextEntry(new TarEntry(inputFile.getName()));
			}
			FileInputStream in = new FileInputStream(inputFile);
			try {
				int c;
				byte[] by = new byte[BUFFEREDSIZE];
				while ((c = in.read(by)) != -1) {
					out.write(by, 0, c);
				}
			} catch (IOException e) {
				throw e;
			} finally {
				in.close();
			}
		}
	}
	
       /**
       * 解压rar格式的压缩文件到指定目录下
       * @param rarFileName 压缩文件
       * @param extPlace 解压目录
       * @throws Exception
       */
	public synchronized void unrarFile(String rarFileName, String extPlace) throws Exception{
	    try{
		    Archive rar = new Archive(new File(rarFileName));
		    FileHeader fh = rar.nextFileHeader();
		    while(fh != null){  
			   System.out.println("fh.name="+fh.getFileNameString());
               File out = new File(extPlace,fh.getFileNameString());
               FileOutputStream os = new FileOutputStream(out);
               rar.extractFile(fh, os);
               os.close();
               fh=rar.nextFileHeader();
		     }
	       }catch(Exception e){
		       e.printStackTrace();
	       }
	    }
	
	
	/**
     * 解压rar格式的压缩文件到指定目录下
     * @param rarFileName 压缩文件
     * @param extPlace 解压目录
     * @param repeatFile 重复路径
     * @throws Exception
     * @author Every
     */
	@SuppressWarnings("unchecked")
	public synchronized void unrar(String rarFileName, String extPlace,List repeatFile) throws Exception{
		File f = new File(rarFileName);
		FileOutputStream os=null;
		Archive a=null;
		try {
			a = new Archive(f);
		} catch (RarException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		extPlace=(extPlace==null||extPlace.trim().equals(""))?f.getParent()+File.separator+f.getName().replace(".", "#").split("#")[0]:extPlace;
//		System.out.println(extPlace);
		File ext=new File(extPlace);
		if(!ext.exists()){
			ext.mkdirs();
		}
		if(a!=null){
			a.getMainHeader().print();
			FileHeader fh = a.nextFileHeader();
			while(fh!=null){
				try {
					File out = new File(extPlace+File.separator+fh.getFileNameString().trim());
					if (out.exists()&&repeatFile!=null) {
						File rFile=new File(extPlace+File.separator+"tempFile");
						if(rFile.exists())rFile.mkdirs();
						repeatFile.add(fh.getFileNameString().trim());
						out=new File(extPlace+File.separator+"tempFile"+File.separator+fh.getFileNameString().trim());
						os = new FileOutputStream(out);
					}else{
						os = new FileOutputStream(out);
					}
					a.extractFile(fh, os);
					os.close();
				} catch (FileNotFoundException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (RarException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				fh=a.nextFileHeader();
			}
		}
	}
	/**
     * 解压rar格式的压缩文件到当前文件所在目录下
     * @param rarFileName 压缩文件
     * @param repeatFile 重复路径
     * @throws Exception
     * @author Every
     */
	@SuppressWarnings("unchecked")
	public synchronized void unrar(String rarFileName,List repeatFile) throws Exception{
		unrar(rarFileName,null,repeatFile);
	}
	
	/**
     * 解压rar格式的压缩文件到指定目录下
     * @param rarFileName 压缩文件
     * @param extPlace 解压目录
     * @throws Exception
     * @author Every
     */
	public synchronized void unrar(String rarFileName,String extPlace) throws Exception{
		unrar(rarFileName,extPlace,null);
	}
	
	/**
     * 解压rar格式的压缩文件到当前文件所在目录下
     * @param rarFileName 压缩文件
     * @param delete 是否删除源文件
     * @throws Exception
     * @author Every
     */
	public synchronized void unrar(String rarFileName) throws Exception{
		unrar(rarFileName,null,null);
	}
	
	
	/**
	 * 执行实例
	 * @param args
	 */
//	public static void main(String[] args) throws Exception {
//		Decompression decompression=new Decompression();
//		decompression.unzipFile("c:/test.zip");
//		decompression.unzip("c:/test.zip","c:/test22");
//		decompression.zip("c:/test22", "c:/test222.zip");
//		decompression.unrar("c:/tests.rar",null,new ArrayList());
//	}
	
}

你可能感兴趣的:(java,C++,c,OS,C#)