解压Zip和Rar文件

package hcit.user.hcit.modules.cpgl.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;

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

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

/**

  1. 解压Zip和Rar压缩文件
  2. @author sjd
  3.     2018-8-22 下午8:10:19
    

*/
public class UnZipRarFile
{
public static final long serialVersionUID = 201808231401L;

/**
 * * 解压文件到指定目录 * 解压后的文件名,和之前一致 *
 * 
 * @param P_ZipFile
 *            待解压的zip文件 *
 * @param P_DescDir
 *            指定目录
 */
@SuppressWarnings("unchecked")
public static void unZipFiles(File P_ZipFile, String P_DescDir) throws IOException
{
	ZipFile zip = new ZipFile(P_ZipFile, "GBK");// 解决中文文件夹乱码
	String strFileName = "";// zip.getName().substring(zip.getName().lastIndexOf('\\') + 1, zip.getName().lastIndexOf('.'));
	File pathFile = new File(P_DescDir + strFileName);
	if (!pathFile.exists())
	{
		pathFile.mkdirs();
	}
	for (Enumeration<? extends ZipEntry> entries = zip.getEntries(); entries.hasMoreElements();)
	{
		ZipEntry entry = (ZipEntry) entries.nextElement();
		String zipEntryName = entry.getName();
		InputStream in = zip.getInputStream(entry);
		String strOutPath = (P_DescDir + strFileName + "/" + zipEntryName).replaceAll("\\*", "/");//文件输出路径
		// 判断路径是否存在,不存在则创建文件路径
		File file = new File(strOutPath.substring(0, strOutPath.lastIndexOf('/')));
		if (!file.exists())
		{
			file.mkdirs();
		}
		// 判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压
		if (new File(strOutPath).isDirectory())
		{
			continue;
		}
		FileOutputStream out = new FileOutputStream(strOutPath);
		byte[] buf1 = new byte[1024];
		int len;
		while ((len = in.read(buf1)) > 0)
		{
			out.write(buf1, 0, len);
		}
		in.close();
		out.close();
	}
}

/**
 * * 根据原始rar路径,解压到指定文件夹下.
 * 
 * @param P_SrcRarPath
 *            原始rar路径
 * @param P_DstDirectoryPath
 *            解压到的文件夹
 */
public static void unRarFile(String P_SrcRarPath, String P_DstDirectoryPath)
{
	if (P_SrcRarPath.toLowerCase().endsWith(".rar") == true)
	{
		File dstDiretory = new File(P_DstDirectoryPath);
		if (!dstDiretory.exists())// 目标目录不存在时,创建该文件夹
		{
			dstDiretory.mkdirs();
		}
		try
		{
			Archive archive = new Archive(new File(P_SrcRarPath));
			if (archive != null)
			{
				FileHeader fh = archive.nextFileHeader();
				while (fh != null)
				{
					// 防止文件名中文乱码问题的处理
					String fileName = fh.getFileNameW().isEmpty() ? fh.getFileNameString() : fh.getFileNameW();
					if (fh.isDirectory())// 文件夹
					{
						File fol = new File(P_DstDirectoryPath + File.separator + fileName);
						fol.mkdirs();
					}
					else
					{
						File out = new File(P_DstDirectoryPath + File.separator + fileName.trim());
						try
						{
							if (!out.exists())
							{
								if (!out.getParentFile().exists())// 相对路径可能多级
								{
									out.getParentFile().mkdirs();
								}
								out.createNewFile();
							}
							FileOutputStream os = new FileOutputStream(out);
							archive.extractFile(fh, os);
							os.close();
						}
						catch (Exception ex)
						{
							ex.printStackTrace();
						}
					}
					fh = archive.nextFileHeader();
				}
				archive.close();
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值