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(); } } }