Java 解压rar 解压缩zip

14 篇文章 0 订阅



首先是MAVEN的pom文件中添加 junrar 找了一天多 没找到jdk中能用的RAR解压类。原因是RAR是有专利的。

不说了---show me code!

<!-- https://mvnrepository.com/artifact/com.github.junrar/junrar -->
		<dependency>
		    <groupId>com.github.junrar</groupId>
		    <artifactId>junrar</artifactId>
		    <version>0.7</version>
		</dependency>
				


import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

import com.github.junrar.Archive;
import com.github.junrar.exception.RarException;
import com.github.junrar.exception.RarException.RarExceptionType;
import com.github.junrar.rarfile.FileHeader;

/**
 * @author zhuss
 * @time 2013-09-07
 */
public class ZipUtil {

	/**
	 * @param zipOutFile
	 *            The file will be generated
	 * @param zipInputFile
	 *            To compress the file or folder
	 * @throws IOException
	 */
	public static boolean zipCompressing(File zipOutFile, File zipInputFile)
			throws IOException {
			boolean flag = true;
			ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(
				zipOutFile));
			BufferedOutputStream bos = new BufferedOutputStream(zos);
			flag = zipCompressingStream(zos, zipInputFile, zipOutFile.getAbsolutePath(),
				bos);
			bos.close();
			zos.close();
			return flag;
	}

	/**
	 * @param zipFileName
	 *            The name of the zip file will be generated
	 * @param zipInputFile
	 *            To compress the file or folder
	 * @throws IOException
	 */
	public static boolean  zipCompressing(String zipFileName, String zipInputFile)
			throws IOException {
		return zipCompressing(new File(zipFileName), new File(zipInputFile));
	}

	/**
	 * 
	 * @param out
	 *            The implementation of file compression flow
	 * @param f
	 *            To compress the file or folder
	 * @param base
	 *            Root node of the compressed file
	 * @param bos
	 *            The compression stream buffer
	 * @throws IOException
	 */
	public static boolean zipCompressingStream(ZipOutputStream out, File f,
			String base, BufferedOutputStream bos) throws IOException {
		boolean flag = true;
		if (f.isDirectory()) {
			File[] f1 = f.listFiles();
			if (f1.length == 0) {
				out.putNextEntry(new ZipEntry(base + "/"));
			} else {
				for (int i = 0; i < f1.length; i++) {
					File file = f1[i];
					flag =   flag && zipCompressingStream(out, file, file.getName(), bos);
				}
			}

		} else {
			out.putNextEntry(new ZipEntry(base));
			FileInputStream in = new FileInputStream(f);
			BufferedInputStream bis = new BufferedInputStream(in);
			int b;

			while ((b = bis.read()) != -1) {
				bos.write(b);
			}
			bos.flush();
			bis.close();
			in.close();
			flag = true;
		}
		return flag;
	}

	/**
	 * 
	 * @param zipFile
	 *            To unzip the files
	 * @param outputPath
	 *            Extract the location
	 */
	public static void  zipDecompressing(File zipFile, String outputPath)
			throws IOException {

		ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFile));
		BufferedInputStream bis = new BufferedInputStream(zis);

		File fOut = null;
		ZipEntry entry = null;
		while ((entry = zis.getNextEntry()) != null && !entry.isDirectory()) {

			fOut = new File(outputPath, entry.getName());

			if (!fOut.exists()) {
				(new File(fOut.getParent())).mkdirs();
			}

			FileOutputStream fos = new FileOutputStream(fOut);

			BufferedOutputStream bos = new BufferedOutputStream(fos);
			int b;
			while ((b = bis.read()) != -1) {
				bos.write(b);
			}
			bos.close();
			fos.close();
		}
		bis.close();
		zis.close();

	}

	
	
	/**
	 * @param rarFileName rar file name
	 * @param outFilePath output file path  
	 * @return success Or Failed
	 * @author zhuss
	 * @throws Exception
	 */
	public static boolean  unrar(String rarFileName, String outFilePath)  throws  Exception{  
		 		
		 boolean flag = false;
	        try  {  
	            Archive archive = new  Archive(new File(rarFileName));  
	            if(archive == null){
	            	throw new FileNotFoundException(rarFileName + " NOT FOUND!");
	            }
	            if(archive.isEncrypted()){
	            	throw new Exception(rarFileName + " IS ENCRYPTED!");
	            }
	            List<FileHeader> files =  archive.getFileHeaders();
	            for (FileHeader fh : files) {
	            		if(fh.isEncrypted()){
	            			throw new Exception(rarFileName + " IS ENCRYPTED!");
	            		} 
	            		String fileName = fh.getFileNameW();
	            		if(fileName != null && fileName.trim().length() > 0){
	            			String saveFileName = outFilePath+"\\"+fileName;
		            		File saveFile = new File(saveFileName);
		            		File parent =  saveFile.getParentFile();
		            		if(!parent.exists()){
		            			parent.mkdirs();
		            		}
		            		if(!saveFile.exists()){
		            			saveFile.createNewFile();
		            		}
		            		FileOutputStream fos = new FileOutputStream(saveFile);
		            		try { 
		            			archive.extractFile(fh, fos); 
		            			fos.flush();
		            			fos.close();
		            		} catch (RarException e) { 
			            		if(e.getType().equals(RarExceptionType.notImplementedYet)){ 
			            		} 
		            		}finally{ 
	 						} 
	            		}
				}
	            flag = true;
	        } catch  (Exception e) {
	        	e.printStackTrace();
	        	throw e;
	        }  
	        return flag;
	    }


}


大家有什么好的RAR压缩和解压缩的类,欢迎推荐给我!



评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值