import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
/**
* 解压工具类
*/
public class DecompressionUtils {
private static final int BUFFER_SIZE = 1024;
/**
* tar拆包解压
*
* @param decompressFilePath
* 要被解压的压缩文件 全路径
* @param resultDirPath
* 解压文件存放绝对路径(目录)
* @throws Exception
* @DATE 2018年9月25日 下午12:39:43
*/
public static boolean tarDecompression(String decompressFilePath, String resultDirPath){
File file = new File(decompressFilePath);
return tarDecompression(file, resultDirPath);
}
/**
* tar拆包解压
*
* @param decompressFile
* 要被解压的压缩文件
* @param resultDirPath
* 解压文件存放绝对路径(目录)
* @throws Exception
* @DATE 2018年9月25日 下午12:39:43
*/
public static boolean tarDecompression(File decompressFile, final String resultDirPath){
int buffersize = 2048;
String basePath = decompressFile.getParent();
if(!resultDirPath.endsWith(File.separator)){
basePath += File.separator;
}
TarArchiveInputStream is = null;
// 存储tar包下所有z文件名
List<String> zFileNames = new ArrayList<>();
try {
is = new TarArchiveInputStream(new FileInputStream(decompressFile));
while (true) {
TarArchiveEntry entry = is.getNextTarEntry();
if (entry == null) {
break;
}
zFileNames.add(entry.getName());
if (entry.isDirectory()) {
// 一般不会执行
new File(basePath + entry.getName()).mkdirs();
} else {
FileOutputStream os = null;
try {
File f = new File(basePath + entry.getName());
if (!f.getParentFile().exists()) {
f.getParentFile().mkdirs();
}
if (!f.exists()) {
f.createNewFile();
}
os = new FileOutputStream(f);
byte[] bs = new byte[buffersize];
int len = -1;
while ((len = is.read(bs)) != -1) {
os.write(bs, 0, len);
}
os.flush();
}
catch (Exception e) {
e.printStackTrace();
}
finally {
os.close();
}
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
is.close();
// 解压后删除tar包
// file.delete();
}
catch (IOException e) {
e.printStackTrace();
}
}
return true;
}
/**
* zip解压(注:与tar类似)
*
* @param decompressFilePath
* 要被解压的压缩文件 全路径
* @param resultDirPath
* 解压文件存放绝对路径(目录)
* @throws Exception
* @DATE 2018年9月25日 下午18:39:43
*/
public static boolean zipDecompression(String decompressFilePath, String resultDirPath){
return zipDecompression(new File(decompressFilePath), resultDirPath);
}
/**
* zip解压(注:与tar类似)
*
* @param decompressFile
* 要被解压的压缩文件
* @param resultDirPath
* 解压文件存放绝对路径(目录)
* @throws Exception
* @DATE 2018年9月25日 下午18:39:43
*/
public static boolean zipDecompression(File decompressFile, String resultDirPath) throws RuntimeException {
// 判断源文件是否存在
if (!decompressFile.exists()) {
throw new RuntimeException(decompressFile.getName());
}
// 开始解压
ZipFile zipFile = null;
try {
zipFile = new ZipFile(decompressFile);
Enumeration<?> entries = zipFile.entries();
while (entries.hasMoreElements()) {
ZipEntry entry = (ZipEntry) entries.nextElement();
System.out.println("解压" + entry.getName());
// 如果是文件夹,就创建个文件夹
if (entry.isDirectory()) {
String dirPath = resultDirPath + File.separator + entry.getName();
File dir = new File(dirPath);
dir.mkdirs();
} else {
// 如果是文件,就先创建一个文件,然后用io流把内容copy过去
File targetFile = new File(resultDirPath + File.separator + entry.getName());
// 保证这个文件的父文件夹必须要存在
if(!targetFile.getParentFile().exists()){
targetFile.getParentFile().mkdirs();
}
targetFile.createNewFile();
// 将压缩文件内容写入到这个文件中
InputStream is = zipFile.getInputStream(entry);
FileOutputStream fos = new FileOutputStream(targetFile);
int len;
byte[] buf = new byte[BUFFER_SIZE];
while ((len = is.read(buf)) != -1) {
fos.write(buf, 0, len);
}
// 关流顺序,先打开的后关闭
fos.close();
is.close();
}
}
} catch (Exception e) {
throw new RuntimeException("解压失败", e);
} finally {
if(zipFile != null){
try {
zipFile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return true;
}
public static boolean tarDecompression(MultipartFile mFile, String decompressionPath) {
try {
File file = new File(mFile.getOriginalFilename());
InputStream ins=mFile.getInputStream();
FileUtils.inputStreamToFile(ins, file);
return tarDecompression(file, decompressionPath);
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
public static boolean zipDecompression(MultipartFile mFile, String decompressionPath) {
try {
File file = new File(mFile.getOriginalFilename());
InputStream ins=mFile.getInputStream();
FileUtils.inputStreamToFile(ins, file);
return zipDecompression(file, decompressionPath);
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
// public static boolean decompression(MultipartFile mFile, String decompressionPath){
// Boolean decompression = false;
// // 判断文件类型
// String fileSuffix = FileUtils.getFileSuffix(mFile.getOriginalFilename());
// PackageType packageType = PackageType.getTypeByStr(fileSuffix);
// if(packageType != null){
// switch (packageType){
// case TAR:
// decompression = DecompressionUtils.tarDecompression(mFile,decompressionPath);break;
// case ZIP:
// decompression = DecompressionUtils.zipDecompression(mFile, decompressionPath);break;
// }
// } else {
// throw new UnsupportedDecompressionType("i18n_unsupported_decompression_type", PackageType.values());
// }
// return decompression;
// }
public static void main(String[] args) {
// File zip = new File("C:\\Users\\Ds\\Desktop\\Dt3.0.zip");
// zipDecompression(zip, "C:\\Users\\Ds\\Desktop");
File tar = new File("C:\\Users\\Ds\\Desktop\\Dt3.0.tar");
tarDecompression(tar, "C:\\Users\\Ds\\Desktop");
}
}
解压工具类
最新推荐文章于 2024-04-09 08:28:22 发布