最全Java 代码实现rar解压操作

  • 最全Java 代码实现rar解压操作
    • 一、通过[com.github.junrar]实现winrar5.0以下版本解压
      • 1、首先贴出来maven依赖,这里使用的是最高版本4.0,但是依然无法解决5.0及其以上的版本问题。
      • 2、代码实现:优化了https://blog.csdn.net/fakergoing/article/details/82260699中的linux中\无法识别问题
      • 3、该方法弊端
    • 二、linux中安装unrar软件
      • 1、unrar安装包
      • 2、linux中安装unrar
      • 3、Java中实现
      • 4、关于Process proc = Runtime.getRuntime().exec(cmd);命令的补充说明
      • 5、关于unrar在linux中的命令说明
    • 2019-6-5更新

最全Java 代码实现rar解压操作

首先,非常感谢下面几位链接上的支持,之所以写这篇博文,主要在于总结,同时给第一次实现该功能的同学提供完整的参考。
因为第一次遇到需要在代码中实现rar和zip的解压操作。而zip其实很简单,jdk自带的ZipUtil就可以实现,这里不做赘述。但是rar的解压,特别是5.0及其以上版本的解压,折腾了我很久。根据这几位博主的思路,结合起来最终实现了对rar文件的解压。
unrar linux的安装:https://blog.51cto.com/lan2003/770497
rar的软件解压方式 :http://www.xitongzhijia.net/xtjc/20150513/48197.html
rar的第三方jar包解压方式:https://blog.csdn.net/fakergoing/article/details/82260699

一、通过[com.github.junrar]实现winrar5.0以下版本解压

1、首先贴出来maven依赖,这里使用的是最高版本4.0,但是依然无法解决5.0及其以上的版本问题。

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

2、代码实现:优化了https://blog.csdn.net/fakergoing/article/details/82260699中的linux中\无法识别问题

/*** 根据原始rar路径,解压到指定文件夹下* 这种方法只能解压rar 5.0版本以下的,5.0及其以上的无法解决** @param srcRarPath       原始rar路径+name* @param dstDirectoryPath 解压到的文件夹*/public static String unRarFile(String srcRarPath, String dstDirectoryPath) throws Exception {log.debug("unRarFile srcRarPath:{}, dstDirectoryPath:{}", srcRarPath, dstDirectoryPath);if (!srcRarPath.toLowerCase().endsWith(".rar")) {log.warn("srcFilePath is not rar file");return "";}File dstDiretory = new File(dstDirectoryPath);// 目标目录不存在时,创建该文件夹if (!dstDiretory.exists()) {dstDiretory.mkdirs();}// @Cleanup Archive archive = new Archive(new File(srcRarPath));  com.github.junrar 0.7版本jarAPI@Cleanup Archive archive = new Archive(new FileInputStream(new File(srcRarPath)));if (archive != null) {// 打印文件信息archive.getMainHeader().print();FileHeader fileHeader = archive.nextFileHeader();while (fileHeader != null) {// 解决中文乱码问题【压缩文件中文乱码】String fileName = fileHeader.getFileNameW().isEmpty() ? fileHeader.getFileNameString() : fileHeader.getFileNameW();// 文件夹if (fileHeader.isDirectory()) {File fol = new File(dstDirectoryPath + File.separator + fileName.trim());fol.mkdirs();} else { // 文件// 解决linux系统中\分隔符无法识别问题String[] fileParts = fileName.split("\\\\");StringBuilder filePath = new StringBuilder();for (String filePart : fileParts) {filePath.append(filePart).append(File.separator);}fileName = filePath.substring(0, filePath.length() - 1);File out = new File(dstDirectoryPath + File.separator + fileName.trim());if (!out.exists()) {// 相对路径可能多级,可能需要创建父目录.if (!out.getParentFile().exists()) {out.getParentFile().mkdirs();}out.createNewFile();}@Cleanup FileOutputStream os = new FileOutputStream(out);archive.extractFile(fileHeader, os);}fileHeader = archive.nextFileHeader();}} else {log.warn("rar file decompression failed , archive is null");}return dstDirectoryPath;}

3、该方法弊端

最大的问题就在于无法实现winrar5.0及其以上版本的解压问题:WinRAR5之后,在rar格式的基础上,推出了另一种rar,叫RAR5,winrar官方并没有开源算法,jar包无法解析这种格式。
咱们先看一段源码

case MarkHeader:this.markHead = new MarkHeader(block);if (!this.markHead.isSignature()) {if (this.markHead.getVersion() == RARVersion.V5) {logger.warn("Support for rar version 5 is not yet implemented!");throw new RarException(RarExceptionType.unsupportedRarArchive);}throw new RarException(RarExceptionType.badRarArchive);}this.headers.add(this.markHead);break;

这是junrar的主类Archive中的rar版本判断语句,这里明确说明了对于5.0版本尚未实现。并且抛出了RarException的异常。

二、linux中安装unrar软件

1、unrar安装包

linux 32位:http://www.rarlab.com/rar/rarlinux-5.3.b4.tar.gz
linux 64位:http://www.rarlab.com/rar/rarlinux-x64-5.3.b4.tar.gz
由于是国外源,所以下载速度极慢,很可能下载不成功。
下面给出tar包,可以直接下载上传使用
【审核还没有通过,通过了再来补充连接】

2、linux中安装unrar

①上传unrar到linux服务器

如 /usr 路径

②解压到指定路径:

tar -zxf /usr/rarlinux-x64-5.7.1.tar.gz -C /usr/local/

③建立软连接:必须要有软连接,类似于jdk的环境变量,保证可以在任意目录下使用rar和unrar命令

 ln -s /usr/local/rar/rar /usr/local/bin/rarln -s /usr/local/rar/unrar /usr/local/bin/unrar

④测试是否创建成功

**在任意路径输入下列命令**
rar
unrar
**出现如下信息表示安装成功**
RAR 5.71   Copyright (c) 1993-2019 Alexander Roshal   28 Apr 2019
Trial version             Type 'rar -?' for help

3、Java中实现

    /*** 采用命令行方式解压文件* 所有文件采用绝对路径** @param rarFilePath 压缩文件路径+文件名* @param destDir     解压结果路径* @return*/public static boolean unRar(String rarFilePath, String destDir) throws Exception {log.debug("begin unrar rarFilePath:{},destDir:{}", rarFilePath, destDir);boolean bool = false;File rarFile = new File(rarFilePath);if (!rarFile.exists()) {log.warn(":{} is not exist", rarFilePath);return false;}File destDirPath = new File(destDir);if (!destDirPath.exists()) {destDirPath.mkdirs();}// 开始调用命令行解压,参数-o+是表示覆盖的意思// String cmdPath = "C:\\Program Files\\WinRAR\\WinRAR.exe"; windows中的路径//  String cmdPath = "/usr/local/bin/unrar"; 如果linux做了软连接 不需要这里配置路径String cmd = "rar" + " X -o+ " + rarFile + " " + destDir;log.debug("cmd :{}", cmd);Process proc = Runtime.getRuntime().exec(cmd);if (proc.waitFor() != 0) {if (proc.exitValue() == 0) {bool = false;}} else {bool = true;}log.debug("unRar " + (bool ? "success" : "failed"));return bool;}

4、关于Process proc = Runtime.getRuntime().exec(cmd);命令的补充说明

// 需要指定参数一:命令位置;参数二:-c表示先执行第一个参数;参数三:你的命令。
Runtime.getRuntime().exec(new String[]{"/bin/sh","c","xxx"});
// 如果执行了上面第三步,可以任意目录使用rar和unrar命令,则可以省略第一和第二个参数,直接使用第三个参数

5、关于unrar在linux中的命令说明

#解压
unrar x abc.rar 表示解压到同一个目录文件夹
unrar e abc.rar 解压出来是散开的

最后,有任何问题,欢迎讨论哦!


2019-6-5更新

rar linux版本的下载链接:
https://download.csdn.net/download/weixin_42418785/11188435

还有一种最简单的安装方式【使用yum安装】:

rpm -ivh http://mirrors.whsir.com/centos/whsir-release-centos.noarch.rpm
yum install rar

Java 代码实现rar解压最全攻略操作相关推荐

  1. java pdf 修改内容_生成PDF全攻略之在已有PDF上添加内容的实现方法

    项目在变,需求在变,不变的永远是敲击键盘的程序员..... PDF 生成后,有时候需要在PDF上面添加一些其他的内容,比如文字,图片.... 经历几次失败的尝试,终于获取到了正确的代码书写方式. 在此 ...

  2. java游戏魔塔20层_魔塔全攻略之一——前20层

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 勇士:快走吧,外面还有很多怪物,我可能顾不上你. 小偷:不,不,不会有事的.快说吧,叫我做什么? 勇士:......你会开门吗? 小偷:那当然. 勇士:那 ...

  3. VSCode插件开发全攻略

    原文:VSCode插件开发全攻略(一)概览 作者:小茗同学 文章索引 VSCode插件开发全攻略(一)概览 VSCode插件开发全攻略(二)HelloWord VSCode插件开发全攻略(三)pack ...

  4. ubuntu解压命令全览(rar)

    ubuntu解压命令全览(rar) Ubuntu下解压rar文件的方法 2010-05-13 12:47 一般通过默认安装的ubuntu是不能解压rar文件的,只有在安装了rar解压工具之后,才可以解 ...

  5. Java实现Zip文件解压

    2019独角兽企业重金招聘Python工程师标准>>> ##1. 两种java实现zip文件解压方式 使用JDK的原生类java.util.zip,上代码: import java. ...

  6. java文件压缩与解压_Java实现文件压缩与解压

    Java实现ZIP的解压与压缩功能基本都是使用了Java的多肽和递归技术,可以对单个文件和任意级联文件夹进行压缩和解压,对于一些初学者来说是个很不错的实例.(转载自http://www.puiedu. ...

  7. c# rar解压大小_C#解压缩Zip,Rar等压缩文件(详细说明)

    其实这个东西网上已经有很多了 给出了一大把  当然我也是在网上找到得 只不过 说明不够详细 经过测试 给出详细的备注: 解压的给的很详细  压缩的基本也一样 只不过参数信息不一样罢了: 利用winra ...

  8. Pendo最新版 全能型记事本/RAR解压帮手v1.17.7,让你的状态随时在线

    繁杂的日常工作让我们忙的不可开交,我们每个人仿佛都像计算机一样需要开启多线程去工作,有时忘记手边一些很重要的事也在所难免.这时,手机中拥有一款合适的软件显得尤为重要.下面给大家推荐几个我觉得用的还不错 ...

  9. java gz压缩文件解压

    java gz压缩文件解压 gzFileName压缩文件全路径 targetFileName解压后的文件全路径 public boolean unGzFile(String gzFileName,St ...

  10. 在Mac上终端使用unrar和rar 解压和压缩软件

    在Mac上终端使用unrar和rar 解压和压缩软件 版本一: 1. 首先从rarlab 网站下载 rar / unrar 工具: 2. 解压缩下载的 tar.gz 压缩包(rarosx-4.1.0. ...

最新文章

  1. matlab doc函数,matlab常用函数.doc
  2. Linux中拷贝和移动文件
  3. python RSA加密、解密、签名
  4. Mr.J--密码强度检测
  5. opencv c语言教程,OpenCV图像处理视频教程——入门篇(一)
  6. 自动化调参NNI学习(三):使用python启动NNI框架调整随机森林(RandomForest)模型
  7. 【LGR-050】洛谷8月月赛
  8. 三种方法打印 main函数的返回地址的值(old EIP)(用途,你懂得!)
  9. C语言scanf跳出循环的问题
  10. 用 ABAP 新建本地 Excel 文件并写入数据试读版
  11. 打印word模板并预览打印
  12. 【ESD专题】1.ESD基础及IEC61000-4-2标准
  13. 线性代数【10】 相似矩阵
  14. 大恒相机Python版Qt界面(一)
  15. python编程代码画画_如何用python编写一个绘制马赛克图像的自写程序
  16. Android 6.0 更新包与已安装应用的签名不一致
  17. 2021华为软挑部分答疑——哪些你有错却总是找不到的地方,我来带你找啦(含标准输入代码)
  18. c语言循环读文件程序,c语言读文件程序报告.docx
  19. 各类参考文献的著录格式及示例
  20. discord china_2020 Discord Bot教程

热门文章

  1. c语言关键字code什么意思,C语言中的32个关键字分别是什么意思?
  2. 1080P or 4K?——明基 TK800M 4K HDR家用投影体验
  3. 正版2008服务器多少钱,Windows server 2008 R2正版报价多少
  4. 关于山东大学(青岛)的吐槽
  5. ArcGIS Server 发布服务失败
  6. 标题python自动化测试培训-UnitTest/PyUnit的用法介绍
  7. 广义相对论-学习记录5-第三章-张量分析与黎曼几何2
  8. GD32 汽车诊断协议 J1850-VPW 测试
  9. CCF CSP 201809-1 卖菜 题解
  10. 如何在CSDN删除自己上传的资源