java 提取(解压)rar文件中特定后缀的文件并保存到指定目录

时间:2023-03-09 22:51:34
java 提取(解压)rar文件中特定后缀的文件并保存到指定目录

内容简介

本文主要介绍使用junrar来提取rar压缩文件中特定后缀(如:png,jpg)的文件并保存到指定目录下。

支持v4及以下版本压缩文件,不支持v5及以上。

在rar文件上右键,查看属性,在压缩文件标签页下,可以看到压缩算法版本,如下图:

java 提取(解压)rar文件中特定后缀的文件并保存到指定目录

java 提取(解压)rar文件中特定后缀的文件并保存到指定目录

压缩时,选择使用RAR4版本来压缩,如下图:

java 提取(解压)rar文件中特定后缀的文件并保存到指定目录

junrar

在GitHub中的地址:https://github.com/junrar/junrar

在Pom文件中的引用

<dependency>
<groupId>com.github.junrar</groupId>
<artifactId>junrar</artifactId>
<version>4.0.0</version>
</dependency>

实现代码(仅供参考,请根据实现情况来修改)

/**
* 将压缩文件中指定后缀名称的文件解压到指定目录
* @param compressFile 压缩文件
* @param baseDirectory 解压到的基础目录(在此目录下创建UUID的目录,存入解压的文件)
* @param decompressSuffs 要提取文件的后缀名
* @return
*/
@Override
public void decompressToDirectory(File compressFile, String baseDirectory, List<String> decompressSuffs) throws Exception{
List<AttachFile> attachFileList = new ArrayList<>(); //验证压缩文件
boolean isFile = compressFile.isFile();
if (!isFile){
System.out.println(String.format("compressFile非文件格式!",compressFile.getName()));
return null;
}
String compressFileSuff = FileUtil.getFileSuffix(compressFile.getName()).toLowerCase();
if (!compressFileSuff.equals("rar")){
System.out.println(String.format("[%s]文件非rar类型的压缩文件!",compressFile.getName()));
return null;
} //region 解压缩文件(rar)
Archive archive = null;
try{
archive = new Archive(compressFile,null);
if (archive == null){return null;}
FileHeader fh = archive.nextFileHeader();
while (fh!=null){
if (fh.isDirectory()) { // 文件夹
continue;
}
else{
String rarEntryName = fh.getFileNameW().trim().equals("") ? fh.getFileNameString().trim() : fh.getFileNameW().trim();
//过滤非指定后缀文件
String suff = FileUtil.getFileSuffix(rarEntryName).toLowerCase();
if (decompressSuffs != null && decompressSuffs.size() > 0){
if (decompressSuffs.stream().filter(s->s.equals(suff)).collect(Collectors.toList()).size() <= 0){
fh = archive.nextFileHeader();
continue;
}
}
//创建解压目录(如果复制的代码,这里会报错,没有StrUtil,这里就是创建了一个目录来存储提取的文件,你可以换其他方式来创建目录)
String groupId = StrUtil.getUUID();
File group = new File(baseDirectory + groupId);
if(!group.exists()){
group.mkdirs();
}
String outPath = (baseDirectory + groupId + File.separator + rarEntryName).replaceAll("\\*", "/");
File out = new File(outPath);
FileOutputStream os = new FileOutputStream(out);
archive.extractFile(fh, os);
os.close(); }
fh = archive.nextFileHeader();
}
}
catch (Exception e){
e.printStackTrace();
}
finally {
archive.close();
}
//endregion
}