java压缩和解压ZIP和RAR文件

  • 该文章主要内容
  • 1.引入依赖
  • 2. 支持解压缩ZIP和winrar 5版本以上的RAR代码
  • 3. 解压缩方式说明
  • 3.1 ZIP可以使用 apache ant 实现文件压缩/解压缩
  • 3.2 winrar 5以下使用java-unrar解压缩,winrar 5需要使用命令解压缩
    • 3.2.1 使用 java-unrar-0.3.jar解压缩
    • 3.2.2 使用 junrar-3.0.0jar解压缩
    • 3.2.3 使用命令解压缩
  • 3.3 Linux版本安装unrar

该文章主要内容

1.引入依赖

<!-- 解压zip -->
<dependency><groupId>org.apache.ant</groupId><artifactId>ant</artifactId><version>1.10.5</version>
</dependency>
<!-- 解压rar -->
<dependency><groupId>com.github.axet</groupId><artifactId>java-unrar</artifactId><version>1.7.0-8</version>
</dependency>

2. 支持解压缩ZIP和winrar 5版本以上的RAR代码

import com.github.junrar.Archive;
import com.github.junrar.rarfile.FileHeader;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;import java.io.*;
import java.util.Enumeration;public class UnZipAndRarUtil {// 获取当前运行环境是win还是linuxprivate static final boolean isLinux = System.getProperty("os.name").toLowerCase().indexOf("linux") >= 0;/*** 使用apache ant实现zip解压缩* @param sourceZip 压缩文件* @param outDir 解压结果路径* @throws IOException*/public static void unZip(String sourceZip, String outDir) throws IOException {File outFileDir = new File(outDir);if (!outFileDir.exists()) {boolean isMakDir = outFileDir.mkdirs();if (isMakDir) {System.out.println("创建压缩目录成功");}}ZipFile zip = new ZipFile(new File(sourceZip));for (Enumeration enumeration = zip.getEntries(); enumeration.hasMoreElements(); ) {ZipEntry entry = (ZipEntry) enumeration.nextElement();String zipEntryName = entry.getName();InputStream in = zip.getInputStream(entry);if (entry.isDirectory()) {      //处理压缩文件包含文件夹的情况File fileDir = new File(outDir + zipEntryName);fileDir.mkdir();continue;}File file = new File(outDir, zipEntryName);file.createNewFile();OutputStream out = new FileOutputStream(file);byte[] buff = new byte[1024];int len;while ((len = in.read(buff)) > 0) {out.write(buff, 0, len);}in.close();out.close();}}/*** 使用junrar解压,只支持winrar 5以下解压缩* @param sourceRar 压缩文件* @param outDir 解压结果路径* @throws Exception*/public static void unRar(String sourceRar, String outDir) throws Exception {File outFileDir = new File(outDir);if (!outFileDir.exists()) {boolean isMakDir = outFileDir.mkdirs();if (isMakDir) {System.out.println("创建压缩目录成功");}}Archive archive = new Archive(new FileInputStream(new File(sourceRar)));FileHeader fileHeader = archive.nextFileHeader();while (fileHeader != null) {if (fileHeader.isDirectory()) {fileHeader = archive.nextFileHeader();continue;}File out = new File(outDir + fileHeader.getFileNameString());if (!out.exists()) {if (!out.getParentFile().exists()) {out.getParentFile().mkdirs();}out.createNewFile();}FileOutputStream os = new FileOutputStream(out);archive.extractFile(fileHeader, os);os.close();fileHeader = archive.nextFileHeader();}archive.close();}/*** 采用命令行方式解压文件,支持winrar 5以上解压缩* @param sourceRar 压缩文件* @param destDir 解压结果路径* @param cmdPath WinRAR.exe的路径,也可以在代码中写死* @return*/public static boolean realExtract(String sourceRar, String destDir,String cmdPath) {File zipFile = new File(sourceRar);// 解决路径中存在/..格式的路径问题destDir = new File(destDir).getAbsoluteFile().getAbsolutePath();while(destDir.contains("..")) {String[] sepList = destDir.split("\\\\");destDir = "";for (int i = 0; i < sepList.length; i++) {if(!"..".equals(sepList[i]) && i < sepList.length -1 && "..".equals(sepList[i+1])) {i++;} else {destDir += sepList[i] + File.separator;}}}boolean bool = false;if (!zipFile.exists()) {return false;}// 开始调用命令行解压,参数-o+是表示覆盖的意思cmdPath = "C:\\Program Files\\WinRAR\\WinRAR.exe";if (isLinux) {cmdPath = "/usr/local/bin/unrar";}String cmd = cmdPath + " X -o+ " + zipFile + " " + destDir;System.out.println(cmd);try {Process proc = Runtime.getRuntime().exec(cmd);if (proc.waitFor() != 0) {if (proc.exitValue() == 0) {bool = false;}} else {bool = true;}} catch (Exception e) {e.printStackTrace();}System.out.println("解压" + (bool ? "成功" : "失败"));return bool;}private static void unfile(String sourceFile, String destDir) throws Exception {// 根据类型,进行相应的解压缩String type = sourceFile.substring(sourceFile.lastIndexOf(".") + 1);if (type.toLowerCase().equals("zip")) {UnZipAndRarUtil.unZip(sourceFile, destDir);} else if (type.toLowerCase().equals("rar")) {UnZipAndRarUtil.realExtract(sourceFile, destDir, null);} else {System.out.println(type.toLowerCase());throw new RuntimeException("deCompress: 只支持zip和rar格式的压缩包!");}}/*** 解压到指定目录*/public static void deCompress(String sourceFile, String destDir) throws Exception {if (sourceFile == null || destDir == null) {throw new RuntimeException("deCompress: 目录不能为空");}// 保证文件夹路径最后是"/"或者"\"char lastChar = destDir.charAt(destDir.length() - 1);if (lastChar != '/' && lastChar != '\\') {// 代码中拼接文件夹 / 建议都用File.separator规避系统不同系统影响destDir += File.separator;}unfile(sourceFile, destDir);}/*** 解压到指定目录*/public static void deCompress(File sourceFile, String destDir) throws Exception {if (!sourceFile.exists() || sourceFile.isDirectory()) {throw new RuntimeException("deCompress: 文件不存在");}deCompress(sourceFile.getPath(), destDir);}/*** 解压到当前目录*/public static void deCompress(String sourceFile) throws Exception {// 获得文件目录int i = sourceFile.lastIndexOf("/");int d = sourceFile.lastIndexOf("\\");if (i == -1 && d == -1) {throw new RuntimeException("deCompress: 目录separator异常");} else if (i == -1) {i = d;}String destDir = sourceFile.substring(0, i + 1);unfile(sourceFile, destDir);}/*** 解压到当前目录* @param sourceFile 当前文件路径* @throws Exception*/public static void deCompress(File sourceFile) throws Exception {if (!sourceFile.exists() || sourceFile.isDirectory()) {throw new RuntimeException("deCompress: 文件不存在");}deCompress(sourceFile.getPath());}public static void main(String[] args) throws Exception {String zipFilepath = "E:\\自己\\test\\自己.rar";UnZipAndRarUtil.deCompress(new File(zipFilepath));}
}

3. 解压缩方式说明

3.1 ZIP可以使用 apache ant 实现文件压缩/解压缩

比较简单,暂不单独说明

3.2 winrar 5以下使用java-unrar解压缩,winrar 5需要使用命令解压缩

3.2.1 使用 java-unrar-0.3.jar解压缩

3.2.2 使用 junrar-3.0.0jar解压缩

    <!-- 解压rar --><dependency><groupId>com.github.junrar</groupId><artifactId>junrar</artifactId><version>3.0.0</version></dependency>

junrar解压本质上都是使用的 java-unrar的解压缩能力,所以也只支持 winrar 5以下压缩文件

具体使用解压缩代码参考如下文章
java解压缩,支持rar和zip

使用java-unrar和junrar包解压会出现如下问题,
其一:如果压缩文件中有中文名字的文件夹,解压以后文件夹名字是乱码,但是不影响文件夹里面的文件;
其二:超过 WinRar5版本的 压缩 .rar 文件会无法解压,报错badRarArchive。
官方解释如下:

针对rar文件解压时报如此异常的可能原因是因为rar压缩算法是不开源的,导致这块资料相对较少,对高版本没有兼容性;
为避免不必要的如此文件解压异常,实际项目中若需要上传文件执行导入等相关功能时,可以强制限定文件格式为非rar格式,如zip开源算法,使用比较成熟就不会有这种尴尬的问题;

3.2.3 使用命令解压缩

目前找到的解压缩WinRar5版本以上最好的方法,使用该解压方式只需要配置win和linix的文件目录即可(用到哪种环境配置哪种)
在win版本使用,需要找到WinRAR.exe安装目录进行配置,
在linux中安装unrar默认路径是/usr/local/bin/unrar
目录位置可以提出在yml中配置,但是因为为了方便使用,暂时统一卸载代码中

3.3 Linux版本安装unrar

先安装unrar,然后调用unrar命令解压
1.安装unrar
wget https://www.rarlab.com/rar/rarlinux-x64-5.7.0.tar.gz 下载unrar包
tar -zxf rarlinux-x64-5.7.0.tar.gz
cd rar
make & make install
安装完成unrar,安装默认路径是/usr/local/bin
里面有rar 和 unrar可执行文件
/usr/local/bin/unrar,路径写这个路径即可,调用上述方法

参考如下文章:
java解压缩,支持rar和zip
com.github.junrar.exception.RarException: badRarArchive—rar5.0版解决方案

java压缩和解压ZIP和RAR文件踩坑实践相关推荐

  1. java压缩和解压流,实现文件压缩和解压,代码都有注释

    压缩和解压流 压缩文件: ZipOutputStream 常用方法 方法名 介绍 ZipOutputStream(OutputStream out) 构造方法:创建新的ZIP输出流 public vo ...

  2. java如何解压rar文件怎么打开_如何在java中实现对zip和rar文件的解压

    如何在java中实现对zip和rar文件的解压 关注:101  答案:1  mip版 解决时间 2021-01-26 10:50 提问者芣①樣哋羙莮 2021-01-25 22:44 如何在java中 ...

  3. php 判断是rar或是zip文件,PHP解压zip和rar文件的方法介绍

    PHP解压zip和rar文件的方法介绍?实例代码举例php语言如何解压文件.php开发经常会遇到解压zip和rar文件,以下方法供大家参考,判断文件是zip类型的还是rar类型,调用相关组件执行解压缩 ...

  4. Linux 下载安装 rar 并解压rar压缩包(Linux下如何解压.zip和.rar文件)

    Linux下如何解压.zip和.rar文件,对于Window下的常见压缩文件.zip和.rar,Linux也有相应的方法来解压它们: 1)对于zip linux下提供了zip和unzip程序,zip是 ...

  5. powershell 压缩和解压zip

    项目场景: 前端项目发布到windows环境需要需要先压缩传输后再解压 问题描述 简单的压缩和解压zip在windows下,视窗情况下,右键就可以实现,但是如果是在命令下,windows不自带unzi ...

  6. C#利用自带的ZipFile压缩和解压zip文件,超级简单

    ZipFile类是.NET Framework 4.5发布的一个C#压缩文件和解压zip文件的一个类库,它支持.NET Framework 4.5以上版本,包括.NET Core1.0和.NET5以上 ...

  7. 使用Python解压zip、rar文件

    解压 zip 文件 基本解压操作 import zipfile''' 基本格式:zipfile.ZipFile(filename[,mode[,compression[,allowZip64]]]) ...

  8. Ubuntu 14 如何解压 .zip、.rar 文件

    .zip 和 .rar 是Windows下常用的压缩文件,在Ubuntu中如何解压. [解压.zip文件] Ubuntu中貌似已经安装了unzip软件,解压命令如下: unzip ./FileName ...

  9. java压缩和解压tar包,tar包、压缩与解压缩

    在Unix下常遇到一些解包.压包的问题.一般情况下将若干文件或文件夹打成tar包,是为了便于文件的传输和管理.例如,通过FTP从Unix平台下载目录结构较多的文件夹到Windows平台或另外一Unix ...

  10. 用SSH压缩和解压zip,gz,.tar.gz等格式的正确方法

    先用一下常用的tar,用tar命令可以压缩文件夹,同样也可以解压缩,tar压缩的文件在win下用winrar或者7z都是可以解压的,如果不能,将后缀名改成.rar继续操作即可. 用tar压缩一个文件夹 ...

最新文章

  1. java程序员遇到的问题_Java 程序员平时最常遇到的故障:系统OOM (一)
  2. T75 大数加法+取模
  3. 【已解决】烂泥:耳机有声音,话筒却没有输入……
  4. python中strip是什么意思啊_Python中的strip()的理解
  5. easyui 如何为标签动态追加属性实现渲染效果
  6. SAP UI5框架渲染的顺序
  7. XML基本概念及增删改查操作
  8. noip2009 普及组
  9. QT中on_pushButton_clicked()用法
  10. 阿里副总裁玄难:藏经阁计划研发大规模知识构建技术首次披露
  11. 《视觉SLAM十四讲》详细笔记
  12. ossfs挂载到本地磁盘
  13. HTML5、css3、js实现3D相册
  14. 玩转华为ENSP模拟器系列 | 配置RSTP功能示例
  15. 如何设置Ubuntu 自动待机时间
  16. android手动触发ke,手机重启问题快速分析定位指南
  17. python 进阶 【封装】 适合小白入门
  18. 股票入门基础知识笔记
  19. TIM微秒级计时学习笔记
  20. ASAN 检测内存错误 debug

热门文章

  1. linux怎么查看pid对应的进程,linux如何查看某个pid的进程?
  2. python支持wps_Linux上使用python调用WPS二次开发接口
  3. CAD绘图软件_常用指令
  4. 在ArcGIS软件中导入数据图标题层不显示的问题
  5. Ruby语言快速入门
  6. CISP 考试教材《第 6 章 知识域:信息安全评估》知识整理
  7. STM32L151C8T6笔记2:RTC唤醒的STOP模式
  8. 关于get方式提交中文乱码问题的解决方式
  9. 教你流程化梳理外贸工作(附18个全流程邮件模板分享)
  10. 如何移动visio2010连接线上的文本