使用java实现文件的打包和压缩包的解压

上篇文章实现了文件夹的打包,但是有一个问题,如果文件夹中包含中文文件,会出现乱码的情况,所以今天我们使用apache中的ant包,此包中的方法目前已经支持中文了,可避免出现乱码的情况发生,代码如下

public class DeCompressUtil {
	
	/**
	 * 将文件夹压缩成 zip格式压缩包
	 */
	public static void compressZip(String pathName , String srcPathName)
			throws Exception {
		
		   File zipFile  = new File(pathName);   
		
		   File srcdir = new File(srcPathName);   
		   
		   if (!srcdir.exists())   
		         throw new RuntimeException(srcPathName + "不存在!");   
		            
	       Project prj = new Project();   
	       
	       Zip zip = new Zip();   
	       
	       zip.setProject(prj);   
	       
	       zip.setDestFile(zipFile);   
	       
	       FileSet fileSet = new FileSet();   
	       
	       fileSet.setProject(prj);   
	       
	       fileSet.setDir(srcdir);   
	       
	       zip.addFileset(fileSet);   
	            
	       zip.execute();   
	}
	
	/**
	 * 解压zip格式压缩包 对应的是ant.jar
	 */
	private static void unzip(String sourceZip, String destDir, boolean loop)
			throws Exception {
		try {
			Project p = new Project();
			Expand e = new Expand();
			e.setProject(p);
			File sorfile = new File(sourceZip);
			e.setSrc(sorfile);
			e.setOverwrite(false);
			e.setDest(new File(destDir));
			/*
			 * 
			 * ant下的zip工具默认压缩编码为UTF-8编码,
			 * 
			 * 而winRAR软件压缩是用的windows默认的GBK或者GB2312编码
			 * 
			 * 所以解压缩时要制定编码格式
			 */
			e.setEncoding("GB2312"); // 根据linux系统的实际编码设置
			e.execute();
			sorfile.delete();
		} catch (Exception e) {
			throw e;
		}
	}

	/**
	 * 解压rar格式压缩包。
	 * 对应的是java-unrar-0.3.jar,但是java-unrar-0.3.jar又会用到commons-logging-1.1.1.jar
	 */
	private static void unrar(String sourceRar, String destDir, boolean loop)
			throws Exception {
		Archive a = null;
		FileOutputStream fos = null;
		try {
			File sorfile = new File(sourceRar);
			a = new Archive(sorfile);
			FileHeader fh = a.nextFileHeader();
			while (fh != null) {
				if (!fh.isDirectory()) {
					// 1 根据不同的操作系统拿到相应的 destDirName 和 destFileName
					// String compressFileName = fh.getFileNameString().trim();
					String compressFileName = fh.getFileNameW().trim();
					if (!existZH(compressFileName)) {
						compressFileName = fh.getFileNameString().trim();
					}
					String destFileName = "";
					String destDirName = "";
					// 非windows系统
					if (File.separator.equals("/")) {
						destFileName = destDir
								+ compressFileName.replaceAll("\\\\", "/");
						destDirName = destFileName.substring(0,
								destFileName.lastIndexOf("/"));
						// windows系统
					} else {
						destFileName = destDir
								+ compressFileName.replaceAll("/", "\\\\");
						destDirName = destFileName.substring(0,
								destFileName.lastIndexOf("\\"));
					}
					// 2创建文件夹
					File dir = new File(destDirName);
					if (!dir.exists() || !dir.isDirectory()) {
						dir.mkdirs();
					}
					// 3解压缩文件
					fos = new FileOutputStream(new File(destFileName));
					a.extractFile(fh, fos);
					fos.close();
					fos = null;
				}
				fh = a.nextFileHeader();
			}
			a.close();
			a = null;
			sorfile.delete();
			//
		} catch (Exception e) {
			throw e;
		} finally {
			if (fos != null) {
				try {
					fos.close();
					fos = null;
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			if (a != null) {
				try {
					a.close();
					a = null;
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}

	private static boolean existZH(String str) {
		String regEx = "[\\u4e00-\\u9fa5]";
		Pattern p = Pattern.compile(regEx);
		Matcher m = p.matcher(str);
		while (m.find()) {
			return true;
		}
		return false;
	}

	/**
	 * 解压缩
	 */
	public static void deCompress(String sourceFile, String destDir,
			boolean loop) throws Exception {
		// 保证文件夹路径最后是"/"或者"\"
		char lastChar = destDir.charAt(destDir.length() - 1);
		if (lastChar != '/' && lastChar != '\\') {
			destDir += File.separator;
		}
		// 根据类型,进行相应的解压缩
		String type = sourceFile.substring(sourceFile.lastIndexOf(".") + 1);
		if (type.equalsIgnoreCase("zip")) {
			unzip(sourceFile, destDir, loop);
		} else if (type.equalsIgnoreCase("rar")) {
			unrar(sourceFile, destDir, loop);
		} else {
			throw new Exception("只支持zip和rar格式的压缩包!");
		}
	}

	public static void main(String[] args) throws Exception {
//		long time = System.currentTimeMillis();
//		System.err.println("start:" + time);
//		try {
//			deCompress("D:\\logs\\CA_SZX.rar", "D:\\logs\\test", false);
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//		System.err.println("end:" + (System.currentTimeMillis() - time));
	    
	    compressZip("D:\\test.zip", "D:\\temp_upload");
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值