Java代码实现rar解压最全攻略操作
⼀、通过[com.github.junrar]实现winrar5.0以下版本解压
1、⾸先贴出来maven依赖,这⾥使⽤的是最⾼版本4.0,但是依然⽆法解决5.0及其以上的版本问题。
<!-- mvnrepository/artifact/com.github.junrar/junrar -->
<dependency>
<groupId>com.github.junrar</groupId>
<artifactId>junrar</artifactId>
<version>4.0.0</version>
</dependency>
2、代码实现:优化了blog.csdn/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 (!LowerCase().endsWith(".rar")) {
log.warn("srcFilePath is not rar file");
return "";
}
File dstDiretory = new File(dstDirectoryPath);
// ⽬标⽬录不存在时,创建该⽂件夹
if (!ists()) {
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) {
// 打印⽂件信息
FileHeader fileHeader = FileHeader();
while (fileHeader != null) {
// 解决中⽂乱码问题【压缩⽂件中⽂乱码】
String fileName = FileNameW().isEmpty() ? FileNameString() : FileNameW();
// ⽂件夹
if (fileHeader.isDirectory()) {
File fol = new File(dstDirectoryPath + File.separator + im());
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 + im());
if (!ists()) {
// 相对路径可能多级,可能需要创建⽗⽬录.
if (!ParentFile().exists()) {
}
}
@Cleanup FileOutputStream os = new FileOutputStream(out);
}
fileHeader = FileHeader();
}
} 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 (Version() == 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的异常。还有⼀种最简单的安装⽅式【使⽤yum安装】:
yum install rar
2、linux中安装unrar
①上传unrar到linux服务器
如 /usr 路径
②解压到指定路径:
tar -zxf /usr/rarlinux-x64-5.7. -C /usr/local/
③建⽴软连接:必须要有软连接,类似于jdk的环境变量,保证可以在任意⽬录下使⽤rar和unrar命令
ln -s /usr/local/rar/rar /usr/local/bin/rar
ln -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 multipartFile 压缩⽂件
* @param fileName 解压⽂件名称
* @return
*/
public RequestResult realExtractRar(MultipartFile multipartFile, String fileName) {
RequestResult result = RequestResult.success();
try {
String filePath = zipPath + "test1/";
File file = new File(zipPath);
file.mkdirs();
File fileDir = new File(filePath);
fileDir.mkdirs();
File saveFile = new File(fileDir, fileName);//将压缩包解析到指定位置
// 获取windows中 的路径
boolean bool = false;
boolean isWin = Property("os.name").toLowerCase().contains("win");
final boolean isLinux = Property("os.name").toLowerCase().indexOf("linux") >= 0;
//uploadDazlFolder: D:\\upload\\danganju\\dazl\\
// winRarPath: C:\Program Files\
// 开始调⽤命令⾏解压,参数-o+是表⽰覆盖的意思
String cmd ="";
if(isWin) {
cmd = winRarPath + " X -o+ " + saveFile + " " + filePath;
}else if(isLinux){
getsavefilenamecmd = linuxRarPath + " X -o+ " + saveFile + " " + filePath;
}
Process proc = Runtime().exec(cmd);
if (proc.waitFor() != 0) {
if (itValue() == 0) {
bool = false;
}
} else {
bool = true;
}
System.out.println("解压" + (bool ? "成功" : "失败"));
if (bool) {
String filePath1 = filePath + fileName.substring(0, fileName.indexOf("."));
result = getFiles(filePath1);
}else{
result = ("上传rar压缩包解压失败!");
}
}catch (Exception e) {
e.printStackTrace();
result = ("上传⽂件异常,异常原因:" + e.getMessage());
}finally {
//删除⽂件和⽂件压缩包
FileUtils.DeleteFolder(zipPath);
}
return result;
}
/*
* 通过递归得到某⼀路径下所有的⽬录及其⽂件
*/
private RequestResult getFiles(String filePath) {
RequestResult result = RequestResult.success();
try {
File srcfile = new File(filePath);
File[] files = srcfile.listFiles();
if (ists()) {
if (files.length == 0) {
result = ("上传⽂件夹是空的!");
} else {
for (File pdffile : files) {
if (pdffile.isDirectory()) {
/
*
* 递归调⽤
*/
AbsolutePath());
} else {
String name = Name();
// File转MultipartFile
FileInputStream input = new FileInputStream(pdffile);
MultipartFile multipartFile1 = new MockMultipartFile("file", name, "text/plain", ByteArray(input)); uploadDazlFromPdf(multipartFile1, name);
input.close();
}
}
}
} else {
result = ("上传⽂件不存在!");
}
}catch (Exception e){
e.printStackTrace();
result = ("上传⽂件异常,异常原因:" + e.getMessage());
}finally {
//删除⽂件和⽂件压缩包
FileUtils.DeleteFolder(zipPath);
}
return result;
}
4、关于Process proc = Runtime().exec(cmd);命令的补充说明
// 需要指定参数⼀:命令位置;参数⼆:-c表⽰先执⾏第⼀个参数;参数三:你的命令。
// 如果执⾏了上⾯第三步,可以任意⽬录使⽤rar和unrar命令,则可以省略第⼀和第⼆个参数,直接使⽤第三个参数
5、关于unrar在linux中的命令说明
#解压
unrar x abc.rar 表⽰解压到同⼀个⽬录⽂件夹
unrar e abc.rar 解压出来是散开的
最后:此⽂章来源
特此记录⼀遍后续使⽤⽅便
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论