1 .导包:

<dependency><groupId>com.github.axet</groupId><artifactId>java-unrar</artifactId><version>1.7.0-8</version>
</dependency>
<dependency><groupId>net.sf.sevenzipjbinding</groupId><artifactId>sevenzipjbinding</artifactId><version>16.02-2.01</version>
</dependency>
<dependency><groupId>net.sf.sevenzipjbinding</groupId><artifactId>sevenzipjbinding-all-platforms</artifactId><version>16.02-2.01</version>
</dependency>
import net.sf.sevenzipjbinding.IInArchive;
import net.sf.sevenzipjbinding.SevenZip;
import net.sf.sevenzipjbinding.impl.RandomAccessFileInStream;import java.io.File;
import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.List;public class FileUtil {public static List<String> unRar(File rarFile, String dstDirectoryPath){IInArchive archive;RandomAccessFile randomAccessFile;try {randomAccessFile = new RandomAccessFile(rarFile,"r");archive = SevenZip.openInArchive(null,new RandomAccessFileInStream(randomAccessFile));int[] in = new int[archive.getNumberOfItems()];for (int i = 0; i < in.length; i++) {in[i] = i;}archive.extract(in,false,new ExtractCallback(archive,dstDirectoryPath));archive.close();randomAccessFile.close();System.out.println("解压目标文件夹:"+dstDirectoryPath);List<String> allFileList = getAllFile(dstDirectoryPath,false);ArrayList<String> resultFileList = new ArrayList<>();String startString;String endString;String finallyString;for (String s : allFileList) {if (s.startsWith("/")||s.startsWith("\\")) {startString = s.substring(0,s.lastIndexOf("\\"));endString = s.substring(s.lastIndexOf("\\")+1);finallyString = startString+"\\"+endString;}else {// windows去掉盘符s.substring(2);startString = s.substring(0,s.lastIndexOf("\\"));endString = s.substring(s.lastIndexOf("\\")+1);finallyString = startString+"/"+endString;}System.out.println("rar文件解压前缀为:"+startString+",rar文件解压后缀为:"+endString);// 解决linux路径出现//导致文件路径错误finallyString = finallyString.replaceAll("//","/");resultFileList.add(finallyString);}System.out.println("rar文件解压文件路径为:"+resultFileList);return resultFileList;} catch (Exception e) {e.printStackTrace();}return null;}public static List<String> getAllFile(String directoryPath,boolean isAddDirectory){List<String> list = new ArrayList<>();File baseFile = new File(directoryPath);if (baseFile.isFile()||!baseFile.exists()) {return list;}File[] files = baseFile.listFiles();for (File file : files) {if (file.isDirectory()) {if (isAddDirectory) {list.add(file.getAbsolutePath());}list.addAll(getAllFile(file.getAbsolutePath(),isAddDirectory));}else {list.add(file.getAbsolutePath());}}return list;}
}

import net.sf.sevenzipjbinding.*;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;public class ExtractCallback implements IArchiveExtractCallback {private int index;private IInArchive inArchive;private String ourDir;public ExtractCallback(IInArchive inArchive, String ourDir) {this.inArchive = inArchive;this.ourDir = ourDir;}@Overridepublic ISequentialOutStream getStream(int index, ExtractAskMode extractAskMode) throws SevenZipException {this.index = index;final String path = (String) inArchive.getProperty(index, PropID.PATH);final boolean isFolder = (boolean) inArchive.getProperty(index, PropID.IS_FOLDER);final String[] oldPath = {""};return new ISequentialOutStream() {@Overridepublic int write(byte[] data) throws SevenZipException {try {if (!isFolder) {File file = new File(ourDir + "\\" + path);if (path.equals(oldPath[0])) {save2File(file, data, true);} else {save2File(file, data, false);}oldPath[0] = path;}} catch (Exception e) {e.printStackTrace();}return data.length;}};}@Overridepublic void prepareOperation(ExtractAskMode extractAskMode) throws SevenZipException {}@Overridepublic void setOperationResult(ExtractOperationResult extractOperationResult) throws SevenZipException {}@Overridepublic void setTotal(long l) throws SevenZipException {}@Overridepublic void setCompleted(long l) throws SevenZipException {}public boolean save2File(File file, byte[] msg, boolean append) {FileOutputStream fos = null;try {File parent = file.getParentFile();boolean bool;if ((!parent.exists()) && (!parent.mkdirs())) {return false;}fos = new FileOutputStream(file, append);fos.write(msg);fos.flush();return true;} catch (Exception e) {e.printStackTrace();return false;} finally {if (fos != null) {try {fos.close();} catch (IOException e) {e.printStackTrace();}}}}
}

测试:

public static void main(String[] args) {String source = "F:\\test\\unrar\\7个小矮人4.rar";String target = "F:\\test\\unrar\\解压后\\";List<String> list = FileUtil.unRar(new File(source), target);list.forEach(System.out::println);
}

java解析rar压缩包兼容rar4相关推荐

  1. Java解压缩zip包+rar包兼容rar4和rar5兼容多操作系统

    业务背景:需要将zip包或者rar包进行解压缩,需要兼容rar4和rar5两种版本 maven 依赖包: <dependency><groupId>com.github.jun ...

  2. java解压rar5 兼容rar4(改bug)

    本篇是为修改原作者bug,原作者:java解压rar5 兼容rar4_So straw?-CSDN博客 在我测试时发现bug,此方法 public int write(byte[] data) thr ...

  3. java解压rar5 兼容rar4

    才发现java库没有对rar5压缩算法实现,网上找了一大堆资料,基本都是调用命令的方式,要集成到项目里是很麻烦的,所以一直奔着java解压rar5的目标去找,终于在github上找到了已经实现好的库, ...

  4. java解析获取Excel中的数据--同时兼容2003及2007

    首先大家先了解一下以下内容:引用 http://feitian0127.iteye.com/blog/1152524 java解析Excel(兼容2003及2007) 刚开始从网上找了个例子使用new ...

  5. java解析zip格式压缩包

    java解析zip格式压缩包 做项目时遇到需要将zip格式的压缩包解析里面的图片 将里面的图片保存到文件夹 并且保存到数据库中关联起来 在上传时判断是否为zip格式的文件 @RequestMappin ...

  6. mysql解释器_atitit.java解析sql语言解析器解释器的实现

    atitit.java解析sql语言解析器解释器的实现 1. 解析sql的本质:实现一个4gl dsl编程语言的编译器 1 2. 解析sql的主要的流程,词法分析,而后进行语法分析,语义分析,构建sq ...

  7. java生成pdf417_生成PDF417的JAVA包.rar

    压缩包 : 生成PDF417的JAVA包.rar 列表 RBarCodeServlet.java javadoc javadoc\allclasses-frame.html javadoc\com j ...

  8. php zip解压,php解压缩zip和rar压缩包文件

    项目涉及文档处理,用户上传的包括zip和rar压缩包,需要先将压缩包解压后再作处理.对于zip压缩包,由于php自带zip扩展,可以直接解压. 解压zip压缩包: $file = "/opt ...

  9. Java解析证书内容

    Java解析证书获取证书内部信息,在证书交换环节中常使用,网络上也提供很多参考方案,本文主要是提供证书base64格式解析和证书路径解析证书内容.在解析时可能会遇到一些问题,后面根据情况再具体说明. ...

最新文章

  1. ajax 取值 返回map_springboot|前端发ajax请求到后台Controller及常见的坑
  2. python webbrowser_python webbrowser模块(浏览器操作)
  3. java发送gmail_如何在Gmail中轻松通过电子邮件发送人群
  4. windows挂载ext4_使用 UEFI 双启动 Windows 和 Linux | Linux 中国
  5. C++多态相关关问题及虚表剖析
  6. Snacks HDU 5692 dfs序列+线段树
  7. 【集】华硕,技嘉主板注入USB3.0驱动
  8. 贪心算法详细讲解(附例题,一看就会)
  9. 记录一下线上高并发情况下 SimpleDateFormat 出现异常问题【项目】
  10. Spring Cloud Bus 使用说明
  11. CF1132D Stressful Training(优先队列+二分)
  12. (73)Wangdao.com第十二天_JavaScript consol 对象与控制台
  13. Linux学习之Kali制作简单的Windows的木马,创建后门
  14. R 语言中1 和1L的区别
  15. 俄罗斯方块的简单实现
  16. 42表盘直径是从哪测量_表盘直径多大合适,怎样测量手表表盘的直径
  17. python视觉识别库_机器视觉、模式识别库汇总
  18. java dispatcher详解_Java Web开发详解:RequestDispatcher接口
  19. AngularJS的$destory用法
  20. MTK方案上基于Android N拦截黑名单中的短/彩信的方法

热门文章

  1. 结合Unity开发中一些编程基础概念与原理性知识总结
  2. 妈妈生了我,ChatGPT淘汰了我爸爸
  3. 详解WAVE音频文件格式
  4. Port already in use: 1099(1099端口被占用的问题)
  5. 操作系统实验--存储管理--页面置换算法--FIFO and LRU c++实现
  6. c#图像相似度比较demo
  7. 企业微信JS-SDK引用(java后台,vue前端)
  8. MacOS 安装 Maven
  9. C++进阶(语法篇)—第11章 设计模式(3)
  10. java毕业生设计法律知识分享平台计算机源码+系统+mysql+调试部署+lw