java压缩文件解压:调用WinRAR5命令强于自己写代码实现
最近,手上维护着一个几年前的系统,技术是用的JSP+Strust2,系统提供了rar和zip两种压缩格式的解压功能,后台是用java实现的
1、解压rar格式,采用的是java-unrar-0.3.jar
2、解压zip格式,采用的是commons-compress-1.4.1.jar
但最近根据用户反馈的问题,发现系统存在两个关于压缩文件解压的问题:
1、有些压缩文件解压之后出现中文乱码;
2、有些压缩文件根本不能解压
为了弥补上述两个问题,在之前代码的基础上打了一些补丁,来解决zip压缩包乱码的问题,思路大概是:
1、采用GBK编码解压
2、递归遍历解压的文件名是否存在中文乱码,这用到了网上很常用的中文检测正则表示式,[\u4e00-\u9fa5]+
3、如果存在中文乱码,则采用UTF-8编码解压
替换后,还是有人反映乱码问题,烦~~~
第二个问题报错如下(出现在有些rar格式解压时):
WARNING: exception in archive constructor maybe file is encrypted or currupt
de.innosystec.unrar.exception.RarException: badRarArchive
at de.innosystec.unrar.Archive.readHeaders(Archive.java:238)
at de.innosystec.unrar.Archive.setFile(Archive.java:122)
at de.innosystec.unrar.Archive.<init>(Archive.java:106)
at de.innosystec.unrar.Archive.<init>(Archive.java:96)
at com.reverse.zipFile.CopyOfZipFileUtil.unrar(CopyOfZipFileUtil.java:242)
at com.reverse.zipFile.CopyOfZipFileUtil.main(CopyOfZipFileUtil.java:303)
借助百度、谷歌找资料发现:
1、java解压文件有两种方式,一是自己写代码,二是调用压缩软件CMD执行
2、第二个错误是由于WinRAR5之后,在rar格式的基础上,推出了另一种rar,叫RAR5,而java-unrar解析不了这种格式
查看rar格式属性可以通过右键 —> 属性查看,如图

因此需要舍弃代码解压的方式,改为CMD调用的方式,虽然压缩软件有很多,但从网上能找到执行命令的,也就WinRAR了,所以我们采用WinRAR5之后的版本解决,5之前的版本肯定是不行的了
使用cmd方式效果如何呢?既能解决中文乱码问题,又能解压RAR5压缩文件,而且代码量还更少了,支持的格式也更多了。
附上CMD方式调用代码:
/**
* 采用命令行方式解压文件
* @param zipFile 压缩文件
* @param destDir 解压结果路径
* @return
*/
public static boolean realExtract(File zipFile, String destDir) {
// 解决路径中存在/..格式的路径问题
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;
}
}
} // 获取WinRAR.exe的路径,放在java web工程下的WebRoot路径下
String classPath = "";
try {
classPath = Thread.currentThread().getContextClassLoader().getResource("").toURI().getPath();
} catch (URISyntaxException e1) {
e1.printStackTrace();
}
// 兼容main方法执行和javaweb下执行
String winrarPath = (classPath.indexOf("WEB-INF") > -1 ? classPath.substring(0, classPath.indexOf("WEB-INF")) :
classPath.substring(0, classPath.indexOf("classes"))) + "/WinRAR/WinRAR.exe";
winrarPath = new File(winrarPath).getAbsoluteFile().getAbsolutePath();
System.out.println(winrarPath); boolean bool = false;
if (!zipFile.exists()) {
return false;
} // 开始调用命令行解压,参数-o+是表示覆盖的意思
String cmd = winrarPath + " 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;
}
java压缩文件解压:调用WinRAR5命令强于自己写代码实现的更多相关文章
- linux压缩文件——解压方法
linux下 tar解压 gz解压 bz2等各种解压文件使用方法 .tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注:tar ...
- SharpCompress的压缩文件解压和文件夹压缩
1.前言 最近做一个功能需要用到对压缩文件的解压,就找到了这个SharpCompress不错,还能解压rar的文件.但是网上的资料和我拿到的SharpCompress.dll的方法有些出入,所以我就自 ...
- java 压缩以及解压文件,有tar,zip,gz(gizp)和解压
package com.yabsz.decompCompr; import java.io.File; import java.util.ArrayList; import java.util.Lis ...
- ubuntu 各压缩文件解压命令大全
.tar 解包:tar xvf xxx.tar 打包:tar cvf xxx.tar DirName (注:tar是打包,不是压缩!) .gz 解压1:gunzip FileName.gz 解压2:g ...
- 《OD学hadoop》在LINUX下如何将tar压缩文件解压到指定的目录下
linux下tar命令解压到指定的目录 :#tar zxvf /bbs.tar.zip -C /zzz/bbs //把根目录下的bbs.tar.zip解压到/zzz/bbs下,前提要保证存在/zzz/ ...
- java压缩与解压文件
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import ...
- java 压缩与解压
最近复习到IO,想找个案例做一做,恰好下载了许多图片压缩包,查看图片很不方便,所以打算用IO把图片都解压到同一个文件夹下.然后集中打包. 本例使用jdk自带的ZipInputStream和ZipOut ...
- java压缩与解压
一 概述 1.目录进入点 目录进入点是文件在压缩文件中的映射,代表压缩文件.压缩文件时,创建目录进入点,将文件写入该目录进入点.解压时,获取目录进入点,将该目录进入点的内容写入硬盘指定文件. 如果目录 ...
- Centos 压缩、解压和打包命令
gzip命令 --功能说明:gz文件的压缩和解压缩. --命令格式:gzip [参数] <文件> --常用参数: -d 解开压缩文件 -l 列出压缩文件的相关信息 -q 不显示警告信息 - ...
随机推荐
- 位运算-出现k次与出现一次
题目:数组中arr只有一个数出现了1次,其他的数都出现了k次,请输出这个只出现了一次的数. 思路:这道题目要求使用位运算实现,如果采用数据结构Map就会简单很多.解此题前先了解不进位加法的思想,比如两 ...
- [Swift]LeetCode636. 函数的独占时间 | Exclusive Time of Functions
Given the running logs of n functions that are executed in a nonpreemptive single threaded CPU, find ...
- [Swift]LeetCode992. K 个不同整数的子数组 | Subarrays with K Different Integers
Given an array A of positive integers, call a (contiguous, not necessarily distinct) subarray of A g ...
- 使用jquery实现返回顶部按钮
实现返回顶部效果,首先需要监听页面的scroll事件,其次才是获取到页面当前的滚动高度 $(window).scrollTop(); 具体代码如下: jquery获取页面元素的一些边界值(宽,高,滚动 ...
- Swagger2 添加HTTP head参数
大家使用swagger往往会和JWT一起使用,而一般使用jwt会将token放在head里,这样我们在使用swagger测试的时候并不方便,因为跨域问题它默认不能自定义head参数.然后自己去网上找, ...
- 【CDH篇】---CDH从初识到搭建到应用
一.前述 CDH(Cloudera's Distribution, including Apache Hadoop)是Hadoop众多分支中的一种,由Cloudera维护,基于稳定版本的Apache ...
- java代码之美(8)---guava字符串工具
guava字符串工具 在java开发过程中对字符串的处理是非常频繁的,google的guava工具对字符串的一些处理进行优化,使我们开发过程中让自己的代码看去更加美观,清爽. 一.Joiner 根据给 ...
- Qt之QComboBox定制(二)
上一篇文章Qt之QComboBox定制讲到了qt实现自定义的下拉框,该篇文章主要实现了列表式的下拉框,这一节我还将继续讲解QComboBox的定制,而这一节我将会讲述更高级的用法,不仅仅是下拉列表框, ...
- Unity资源 ----加载最好需要做哪些事
先上图解 一.基本关键词 1)AssetBundle:一种保存“一个或多个资源的转变为某种利于传输等的特殊格式(二进制之类)”的文件.(我这边是使用Unity制作手游的角度来说明) 简称AB. 2)对 ...
- Solr 09 - SolrJ操作Solr单机服务 (Solr的Java API)
目录 1 SolrJ是什么 2 SolrJ对索引的CRUD操作 2.1 创建Maven工程(打包方式选择为jar) 2.2 配置pom.xml文件, 加入SolrJ的依赖 2.3 添加和修改索引 2. ...