java解压zip格式文件和rar的格式

rar需要的jar包:junrar-1.0.1.jar
package com.gxkj.core.utils;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

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

public class UtilZipAndRar {
	/**
	 * 
	 * @param rarFile
	 *            rar文件路径
	 * 
	 * @param savePath
	 *            要解压的路径
	 * 
	 */
	public static void Rar(String rarFile, String savePath) {

		// 判断是否rar文件
		if (!rarFile.endsWith(".rar")) {
			System.err.println("打开的文件不是rar文件!");
			return;
		}
		try {
			FileOutputStream fos = null;
			// 创建一个rar档案文件
			Archive rarArchive = new Archive(new File(rarFile));
			// 判断是否有加密
			if (rarArchive != null) {
				if (rarArchive.isEncrypted()) {
					rarArchive.close();// 关闭资源
					return;
				}
				FileHeader fileHeader = rarArchive.nextFileHeader();
				while (fileHeader != null) {
					if (!fileHeader.isDirectory()) {
						// 从压缩文件中解压出来的文件名,有可能带目录的文件名
//						String name = fileHeader.getFileNameString().trim();
						String name = fileHeader.getFileNameW().isEmpty() ? fileHeader
								.getFileNameString() : fileHeader.getFileNameW();
						String outPutFileName = savePath + "\\" + name;
						// 分离文件名,为了创建目录
						File dir = new File(outPutFileName.substring(0, outPutFileName.lastIndexOf("\\")));
						// 创建文件夹
						if (!dir.exists() || !dir.isDirectory()) {
							dir.mkdirs();
						}
						fos = new FileOutputStream(new File(outPutFileName));
						// 保存解压的文件
						rarArchive.extractFile(fileHeader, fos);
						// 关闭资源
						fos.close();
						fos = null;
					}
					fileHeader = rarArchive.nextFileHeader();
				}
			}
			rarArchive.close();// 关闭资源
		} catch (RarException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	public static void main(String[] args) {
		//Rar("E:\\b\\建设路街道数据.rar", "E:\\a");
		//Zip("E:\\b\\jacob-1.17-M2 2.zip", "E:\\a");
	}
	
	public static void Zip(String rarFile, String savePath) {
		//	String Inputpath = "E:\\b";//压缩包地址
		//	String outpath = "E:\\a";//解压到的文件地址
			ZipEntry zipEntry = null;
			try (
				// ZipInputStream读取压缩文件													//压缩包名称
	            ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(rarFile),Charset.forName("GBK"));
	            // 写入到缓冲流中
	            BufferedInputStream bufferedInputStream = new BufferedInputStream(zipInputStream);
					)
			{
				File fileOut = null;
				// 读取压缩文件中的一个文件
				while ((zipEntry = zipInputStream.getNextEntry()) != null) {
					// 若当前zipEntry是一个文件夹
					if (zipEntry.isDirectory()) {
						fileOut = new File(savePath + "\\" + zipEntry.getName());
						// 在指定路径下创建文件夹
						if (!fileOut.exists()) {
							fileOut.mkdirs();
						}
						// 若是文件
					} else {
						// 原文件名与指定路径创建File对象(解压后文件的对象)
						fileOut = new File(savePath, zipEntry.getName());
						try (FileOutputStream fileOutputStream = new FileOutputStream(fileOut);
								BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);) {
							// 将文件写入到指定file中
							int b = 0;
							while ((b = bufferedInputStream.read()) != -1) {
								bufferedOutputStream.write(b);
							}
						} catch (Exception e) {
							e.printStackTrace();
						}
					}

				}
			} catch (Exception e) {
				e.printStackTrace();
			}
	}
}

猜你喜欢

转载自blog.csdn.net/qq_38567039/article/details/80664285