Java解压zip和rar工具类

这个类参考了别人的写法。原帖写法变量命名不太亲切,解压完忘记关闭文件,也没有考虑解压出现异常要关闭流的问题。所以我的改动比较大,使代码比较美观,保证了流的关闭。需要说明的一点,就是zip解压方法解压出来是没有目录结构的,就是把压缩包里所有文件,即使是很多层目录里的文件,都解压在一个目录。rar的解压方法解压出来就有目录结构。解压zip需要用到的jar包是:ant-1.6.5.jar,解压rar需要用到的jar包是:junrar-0.7.jar。

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;

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

/**
 * 解压Zip、RAR工具类
 * 
 * 
 */
public class ZipRarUtils {

	/**
	 * 解压zip
	 * 
	 * @param zipFile
	 *            zip文件
	 * @param deCompressPath
	 *            解压路径
	 */
	public static void unZip(File zipFile, String deCompressPath) {
		OutputStream os = null;
		InputStream is = null;
		File deCompressFilePath= new File(deCompressPath);
		deCompressFilePath.mkdirs();
		try {
			ZipFile zf = new ZipFile(zipFile);
			for (Enumeration entries = zf.getEntries(); entries.hasMoreElements();) {
				ZipEntry entry = ((ZipEntry) entries.nextElement());
				is = zf.getInputStream(entry);
				String zipEntryName = entry.getName();
				zipEntryName = zipEntryName.substring(zipEntryName.lastIndexOf("/") + 1);
				if (!"".equals(zipEntryName)) {
					os = new FileOutputStream(deCompressPath + File.separator + zipEntryName);
					byte[] buf1 = new byte[1024];
					int len;
					while ((len = is.read(buf1)) > 0) {
						os.write(buf1, 0, len);
					}
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				is.close();
			} catch (IOException e) {
			}
			try {
				os.close();
			} catch (IOException e) {
			}
		}
	}

	/**
	 * 解压rar
	 * 
	 * @param rarFile
	 *            rar文件
	 * @param deCompressPath
	 *            解压路径
	 */
	public static void unRar(File rarFile, String deCompressPath) {
		File deCompressFilePath = new File(deCompressPath);
		deCompressFilePath.mkdirs();
		Archive a = null;
		try {
			a = new Archive(rarFile);
			if (a != null) {
				FileHeader fh = a.nextFileHeader();
				while (fh != null) {
					if (fh.isDirectory()) {
						File fol = new File(deCompressPath + File.separator
								+ fh.getFileNameString());
						fol.mkdirs();
					} else {
						File out = new File(deCompressPath + File.separator
								+ fh.getFileNameString().trim());
						try {
							if (!out.exists()) {
								if (!out.getParentFile().exists()) {// 相对路径可能多级,可能需要创建父目录。
									out.getParentFile().mkdirs();
								}
								out.createNewFile();
							}
							FileOutputStream os = new FileOutputStream(out);
							a.extractFile(fh, os);
							os.close();
						} catch (Exception ex) {
							ex.printStackTrace();
						}
					}
					fh = a.nextFileHeader();
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				a.close();
			} catch (IOException e) {
			}
		}
	}
}


你可能感兴趣的:(Java解压zip和rar工具类)