java 解压zip、rar文件

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.io.OutputStream;
import java.nio.charset.Charset;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;

import com.github.junrar.Archive;
import com.github.junrar.rarfile.FileHeader;

/**
 * 
 * @ClassName: FileCompress 
 * @Description: TODO(这里用一句话描述这个类的作用) 
 * @author 周玉波
 * @date 2017年4月11日 上午9:30:11 
 *
 */
@SuppressWarnings("rawtypes")
public final class FileCompress{
	/**
     * zip解压缩
     * 
     * @param zipfile
     *            File 需要解压缩的文件
     * @param descDir
     *            String 解压后的目标目录
     */
    public static String unZipFiles(java.io.File zipfile, String descDir) {
    	InputStream in =null;
    	OutputStream out =null;
    	ZipFile zf=null;
    	File file=null;
    	String zipEntryName="";
        try {
        	descDir=descDir.replaceAll("\\/", "\\\\").replaceAll("\\.zip", "");
        	//jdk1.8没有参数Charset,适用于1.7
            zf = new ZipFile(zipfile,Charset.forName("GBK"));
            for (Enumeration entries = zf.entries(); entries
                    .hasMoreElements();) {
                ZipEntry entry = ((ZipEntry) entries.nextElement());
                zipEntryName = entry.getName();
                
                boolean ismkdir = false;  
                if(zipEntryName.lastIndexOf("/") != -1){ //检查此文件是否带有文件夹  
                   ismkdir = true;  
                }  
                zipEntryName = descDir+"\\" + zipEntryName;  
 
                if(entry.isDirectory()){ //如果是文件夹先创建  
                   file = new File(zipEntryName);  
                   file.mkdirs();  
                    continue;  
                }  
                file = new File(zipEntryName);  
                if(!file.exists()){ //如果是目录先创建  
                   if(ismkdir){  
                   new File(zipEntryName.substring(0, zipEntryName.lastIndexOf("/"))).mkdirs(); //目录先创建  
                   }  
                }  
                //file.createNewFile(); //创建文件
                
                in = zf.getInputStream(entry);
                File dstDiretory = new File(descDir);
                if (!dstDiretory.exists()) {// 目标目录不存在时,创建该文件夹
                    dstDiretory.mkdirs();
                }
                out = new FileOutputStream(zipEntryName);
                byte[] buf1 = new byte[1024];
                int len;
                while ((len = in.read(buf1)) > 0) {
                    out.write(buf1, 0, len);
                }
                System.out.println("解压缩完成.");
            }
            return zipEntryName.replaceAll("/", "\\\\");
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
        	try {
	        	if(out!=null){
					out.close();
					out=null;
	        	}
	        	if(in!=null){
					in.close();
					in=null;
	        	}
	        	if(zf!=null){
	        		zf.close();
	        		zf=null;
	        	}
        	} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
        	System.gc();
        }
		return null;
    }

    /** 
    * 根据原始rar路径,解压到指定文件夹下.      
    * @param srcRarPath 原始rar路径 
    * @param dstDirectoryPath 解压到的文件夹      
    */
    public static String unRarFile(String srcRarPath, String dstDirectoryPath) {
    	dstDirectoryPath=dstDirectoryPath.replaceAll("\\/", "\\\\").replaceAll("\\.rar", "");
    	//dstDirectoryPath=dstDirectoryPath.substring(0,dstDirectoryPath.lastIndexOf("\\"));
        if (!srcRarPath.toLowerCase().endsWith(".rar")) {
            System.out.println("非rar文件!");
            return "";
        }
        File dstDiretory = new File(dstDirectoryPath);
        if (!dstDiretory.exists()) {// 目标目录不存在时,创建该文件夹
            dstDiretory.mkdirs();
        }
        Archive a = null;
        FileOutputStream os=null;
        try {
            a = new Archive(new File(srcRarPath));
            if (a != null) {
                a.getMainHeader().print(); // 打印文件信息.
                FileHeader fh = a.nextFileHeader();
                while (fh != null) {
                    if (fh.isDirectory()) { // 文件夹 
                        File fol = new File(dstDirectoryPath + File.separator
                                + fh.getFileNameString());
                        fol.mkdirs();
                    } else { // 文件
                        File out = new File(dstDirectoryPath + File.separator
                                + fh.getFileNameString().trim());
                        //System.out.println(out.getAbsolutePath());
                        try {// 之所以这么写try,是因为万一这里面有了异常,不影响继续解压. 
                            if (!out.exists()) {
                                if (!out.getParentFile().exists()) {// 相对路径可能多级,可能需要创建父目录. 
                                    out.getParentFile().mkdirs();
                                }
                                out.createNewFile();
                            }
                            os = new FileOutputStream(out);
                            a.extractFile(fh, os);
                        } catch (Exception ex) {
                            ex.printStackTrace();
                        }finally{
                        	if(os!=null){
                        		os.close();
                        		os=null;
                        	}
                        }
                    }
                    fh = a.nextFileHeader();
                }
            }
            return dstDirectoryPath;
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
        	if(a!=null){
        		try {
					a.close();
					a=null;
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
        	}
        }
        return "";
    }
}
RAR的解压需要导入包junrar-0.7.jar

猜你喜欢

转载自blog.csdn.net/zyb112211/article/details/69397594