1、7z和rar需要引入maven依赖,zip使用java自带的
<!-- 7z解压依赖 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.9</version>
</dependency>
<dependency>
<groupId>org.tukaani</groupId>
<artifactId>xz</artifactId>
<version>1.5</version>
</dependency>
<!-- rar解压依赖 -- >
<dependency>
<groupId>net.sf.sevenzipjbinding</groupId>
<artifactId>sevenzipjbinding</artifactId>
<version>16.02-2.01</version>
</dependency>
<dependency>
<groupId>net.sf.sevenzipjbinding</groupId>
<artifactId>sevenzipjbinding-all-platforms</artifactId>
<version>16.02-2.01</version>
</dependency>
2、编写解压util工具类
/**
* 文件解压缩工具类
*/
public class UnFileUtil {
/**
* rar解压缩
* @param rarFile rar文件的全路径
* @return 压缩包中所有的文件
*/
@SuppressWarnings("resource")
public static Map<String, String> unRar(String rarFile) {
RandomAccessFile randomAccessFile = null;
IInArchive archive = null;
try {
File f = new File(rarFile);
randomAccessFile = new RandomAccessFile(f.getAbsolutePath(), "rw");
archive = SevenZip.openInArchive(ArchiveFormat.RAR,
new RandomAccessFileInStream(randomAccessFile));
String outPath = f.getAbsolutePath().substring(0, f.getAbsolutePath().indexOf("."));
File zdir = new File(outPath);
if (zdir.isDirectory()) {
zdir.delete();
}
zdir.mkdir();
int[] in = new int[archive.getNumberOfItems()];
for (int i = 0; i < in.length; i++) {
in[i] = i;
}
archive.extract(in, false, new ExtractCallback(archive,zdir.getAbsolutePath() + "/"));
//解压后获取压缩包下全部文件列表
Map<String, String> zipFileMap = getFileNameList(outPath,"");
return zipFileMap;
} catch (FileNotFoundException | SevenZipException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if(randomAccessFile != null) randomAccessFile.close();
if(archive != null) archive.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
/**
* 获取压缩包中的全部文件
* @param path 文件夹路径
* @childName 每一个文件的每一层的路径==D==区分层数
* @return 压缩包中所有的文件
*/
private static Map<String, String> getFileNameList(String path, String childName) {
System.out.println("path:" + path + "---childName:"+childName);
Map<String, String> files = new HashMap<>();
File file = new File(path); // 需要获取的文件的路径
String[] fileNameLists = file.list(); // 存储文件名的String数组
File[] filePathLists = file.listFiles(); // 存储文件路径的String数组
for (int i = 0; i < filePathLists.length; i++) {
if (filePathLists[i].isFile()) {
files.put(fileNameLists[i] + "==D==" + childName, path + File.separator + filePathLists[i].getName());
} else {
files.putAll(getFileNameList(path + File.separator + filePathLists[i].getName(), childName + "&" + filePathLists[i].getName()));
}
}
return files;
}
/**
* zip解压缩
* @param zipFilePath zip文件的全路径
* @param unzipFilePath 解压后文件保存路径
* @param includeZipFileName 解压后文件是否包含压缩包文件名,true包含,false不包含
* @return 压缩包中所有的文件
*/
@SuppressWarnings("resource")
public static Map<String, String> unZip(String zipFilePath, String unzipFilePath, boolean includeZipFileName) throws Exception{
File zipFile = new File(zipFilePath);
//如果包含压缩包文件名,则处理保存路径
if(includeZipFileName){
String fileName = zipFile.getName();
if(StringUtils.isNotEmpty(fileName)){
fileName = fileName.substring(0,fileName.lastIndexOf("."));
}
unzipFilePath = unzipFilePath + File.separator + fileName;
}
//判断保存路径是否存在,不存在则创建
File unzipFileDir = new File(unzipFilePath);
if(!unzipFileDir.exists() || !unzipFileDir.isDirectory()){
unzipFileDir.mkdirs();
}
//开始解压
ZipEntry entry = null;
String entryFilePath = null, entryDirPath = "";
File entryFile = null, entryDir = null;
int index = 0, count = 0, bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
Charset gbk = Charset.forName("GBK");
ZipFile zip = new ZipFile(zipFile, gbk);
try {
Enumeration<ZipEntry> entries = (Enumeration<ZipEntry>) zip.entries();
while (entries.hasMoreElements()) {
entry = entries.nextElement();
entryFilePath = unzipFilePath + File.separator + entry.getName();
entryFilePath = entryFilePath.replace("/", File.separator);
index = entryFilePath.lastIndexOf(File.separator);
if (index != -1) {
entryDirPath = entryFilePath.substring(0, index);
}
entryDir = new File(entryDirPath);
if (!entryDir.exists() || !entryDir.isDirectory()) {
entryDir.mkdirs();
}
entryFile = new File(entryFilePath);
//判断当前文件父类路径是否存在,不存在则创建
if(!entryFile.getParentFile().exists() || !entryFile.getParentFile().isDirectory()){
entryFile.getParentFile().mkdirs();
}
//不是文件说明是文件夹创建即可,无需写入
if(entryFile.isDirectory()){
continue;
}
bos = new BufferedOutputStream(new FileOutputStream(entryFile));
bis = new BufferedInputStream(zip.getInputStream(entry));
while ((count = bis.read(buffer, 0, bufferSize)) != -1) {
bos.write(buffer, 0, count);
}
}
}catch (Exception e){
e.printStackTrace();
}finally {
bos.flush();
bos.close();
bis.close();
zip.close();
}
Map<String, String> resultMap = getFileNameList(unzipFilePath, "");
return resultMap;
}
/**
* zip解压缩
* @param zipFilePath zip文件的全路径
* @param includeZipFileName 解压后文件是否包含压缩包文件名,true包含,false不包含
* @return 压缩包中所有的文件
*/
@SuppressWarnings("resource")
public static Map<String, String> unZip(String zipFilePath, boolean includeZipFileName) throws Exception{
File zipFile = new File(zipFilePath);
String unzipFilePath = zipFilePath.substring(0, zipFilePath.lastIndexOf(File.separator));
//如果包含压缩包文件名,则处理保存路径
if(includeZipFileName){
String fileName = zipFile.getName();
if(StringUtils.isNotEmpty(fileName)){
fileName = fileName.substring(0,fileName.lastIndexOf("."));
}
unzipFilePath = unzipFilePath + File.separator + fileName;
}
//判断保存路径是否存在,不存在则创建
File unzipFileDir = new File(unzipFilePath);
if(!unzipFileDir.exists() || !unzipFileDir.isDirectory()){
unzipFileDir.mkdirs();
}
//开始解压
ZipEntry entry = null;
String entryFilePath = null, entryDirPath = "";
File entryFile = null, entryDir = null;
int index = 0, count = 0, bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
Charset gbk = Charset.forName("GBK");
ZipFile zip = new ZipFile(zipFile, gbk);
try {
Enumeration<ZipEntry> entries = (Enumeration<ZipEntry>) zip.entries();
while (entries.hasMoreElements()) {
entry = entries.nextElement();
entryFilePath = unzipFilePath + File.separator + entry.getName();
entryFilePath = entryFilePath.replace("/", File.separator);
index = entryFilePath.lastIndexOf(File.separator);
if (index != -1) {
entryDirPath = entryFilePath.substring(0, index);
}
entryDir = new File(entryDirPath);
if (!entryDir.exists() || !entryDir.isDirectory()) {
entryDir.mkdirs();
}
entryFile = new File(entryFilePath);
//判断当前文件父类路径是否存在,不存在则创建
if(!entryFile.getParentFile().exists() || !entryFile.getParentFile().isDirectory()){
entryFile.getParentFile().mkdirs();
}
//不是文件说明是文件夹创建即可,无需写入
if(entryFile.isDirectory()){
continue;
}
bos = new BufferedOutputStream(new FileOutputStream(entryFile));
bis = new BufferedInputStream(zip.getInputStream(entry));
while ((count = bis.read(buffer, 0, bufferSize)) != -1) {
bos.write(buffer, 0, count);
}
bos.flush();
bos.close();
bis.close();
}
}catch (Exception e){
e.printStackTrace();
}finally {
zip.close();
}
Map<String, String> resultMap = getFileNameList(unzipFilePath, "");
return resultMap;
}
/**
* 7z解压缩
* @param z7zFilePath 7z文件的全路径
* @return 压缩包中所有的文件
*/
public static Map<String, String> un7z(String z7zFilePath){
String un7zFilePath = ""; //压缩之后的绝对路径
SevenZFile zIn = null;
try {
File file = new File(z7zFilePath);
un7zFilePath = file.getAbsolutePath().substring(0, file.getAbsolutePath().lastIndexOf(".7z"));
zIn = new SevenZFile(file);
SevenZArchiveEntry entry = null;
File newFile = null;
while ((entry = zIn.getNextEntry()) != null){
//不是文件夹就进行解压
if(!entry.isDirectory()){
newFile = new File(un7zFilePath, entry.getName());
if(!newFile.exists()){
new File(newFile.getParent()).mkdirs(); //创建此文件的上层目录
}
OutputStream out = new FileOutputStream(newFile);
BufferedOutputStream bos = new BufferedOutputStream(out);
int len = -1;
byte[] buf = new byte[(int)entry.getSize()];
while ((len = zIn.read(buf)) != -1){
bos.write(buf, 0, len);
}
bos.flush();
bos.close();
out.close();
}
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if (zIn != null)
zIn.close();
} catch (IOException e) {
e.printStackTrace();
}
}
Map<String, String> resultMap = getFileNameList(un7zFilePath, "");
return resultMap;
}
public static void main(String[] args) {
try {
un7z("C:\\Users\\Admin\\Desktop\\1716F0190017.7z");
} catch (Exception e) {
e.printStackTrace();
}
}
}