六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 1506|回复: 0

java解压zip与rar

[复制链接]

升级  68%

8

主题

8

主题

8

主题

童生

Rank: 1

积分
34
 楼主| 发表于 2013-2-7 10:05:08 | 显示全部楼层 |阅读模式
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:mwgjkf@hotmail.com *   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 blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.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 blocke.printStackTrace();} catch (RarException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.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());//}}
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表