常用的压缩文件解压
Tar、tarBzip2、Bzip2、Gz、TarGz、Zip、Rar
jar包准备
commons-compress-1.17.jar
commons-io-2.6.jar
commons-lang3-3.7.jar
commons-logging-1.2.jar
java-unrar-0.3.jar
CompressUtils
import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream;
import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
import org.apache.commons.compress.utils.IOUtils;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
/**
* 解压工具类
*/
public class CompressUtils {
private static final int BUFFER_SIZE = 2048;
private static List<String> unTar(InputStream inputStream, String destDir) throws Exception {
List<String> fileNames = new ArrayList<String>();
TarArchiveInputStream tarIn = new TarArchiveInputStream(inputStream, BUFFER_SIZE);
TarArchiveEntry entry = null;
try {
while ((entry = tarIn.getNextTarEntry()) != null) {
fileNames.add(entry.getName());
if (entry.isDirectory()) {//是目录
createDirectory(destDir, entry.getName());//创建空目录
} else {//是文件
File tmpFile = new File(destDir + File.separator + entry.getName());
createDirectory(tmpFile.getParent() + File.separator, null);//创建输出目录
OutputStream out = null;
try {
out = new FileOutputStream(tmpFile);
int length = 0;
byte[] b = new byte[2048];
while ((length = tarIn.read(b)) != -1) {
out.write(b, 0, length);
}
} finally {
IOUtils.closeQuietly(out);
}
}
}
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
IOUtils.closeQuietly(tarIn);
}
return fileNames;
}
public static List<String> unTar(String tarFile, String destDir) throws Exception {
File file = new File(tarFile);
return unTar(file, destDir);
}
public static List<String> unTar(File tarFile, String destDir) throws Exception {
if (StringUtils.isBlank(destDir)) {
destDir = tarFile.getParent();
}
destDir = destDir.endsWith(File.separator) ? destDir : destDir + File.separator;
return unTar(new FileInputStream(tarFile), destDir);
}
public static List<String> unTarBZip2(File tarFile, String destDir) throws Exception {
if (StringUtils.isBlank(destDir)) {
destDir = tarFile.getParent();
}
destDir = destDir.endsWith(File.separator) ? destDir : destDir + File.separator;
return unTar(new BZip2CompressorInputStream(new FileInputStream(tarFile)), destDir);
}
public static List<String> unTarBZip2(String file, String destDir) throws Exception {
File tarFile = new File(file);
return unTarBZip2(tarFile, destDir);
}
public static List<String> unBZip2(String bzip2File, String destDir) throws IOException {
File file = new File(bzip2File);
return unBZip2(file, destDir);
}
public static List<String> unBZip2(File srcFile, String destDir) throws IOException {
if (StringUtils.isBlank(destDir)) {
destDir = srcFile.getParent();
}
destDir = destDir.endsWith(File.separator) ? destDir : destDir + File.separator;
List<String> fileNames = new ArrayList<String>();
InputStream is = null;
OutputStream os = null;
try {
File destFile = new File(destDir, FilenameUtils.getBaseName(srcFile.toString()));
fileNames.add(FilenameUtils.getBaseName(srcFile.toString()));
is = new BZip2CompressorInputStream(new BufferedInputStream(new FileInputStream(srcFile), BUFFER_SIZE));
os = new BufferedOutputStream(new FileOutputStream(destFile), BUFFER_SIZE);
IOUtils.copy(is, os);
} finally {
IOUtils.closeQuietly(os);
IOUtils.closeQuietly(is);
}
return fileNames;
}
public static List<String> unGZ(String gzFile, String destDir) throws IOException {
File file = new File(gzFile);
return unGZ(file, destDir);
}
public static List<String> unGZ(File srcFile, String destDir) throws IOException {
if (StringUtils.isBlank(destDir)) {
destDir = srcFile.getParent();
}
destDir = destDir.endsWith(File.separator) ? destDir : destDir + File.separator;
List<String> fileNames = new ArrayList<String>();
InputStream is = null;
OutputStream os = null;
try {
File destFile = new File(destDir, FilenameUtils.getBaseName(srcFile.toString()));
fileNames.add(FilenameUtils.getBaseName(srcFile.toString()));
is = new GzipCompressorInputStream(new BufferedInputStream(new FileInputStream(srcFile), BUFFER_SIZE));
os = new BufferedOutputStream(new FileOutputStream(destFile), BUFFER_SIZE);
IOUtils.copy(is, os);
} finally {
IOUtils.closeQuietly(os);
IOUtils.closeQuietly(is);
}
return fileNames;
}
public static List<String> unTarGZ(File tarFile, String destDir) throws Exception {
if (StringUtils.isBlank(destDir)) {
destDir = tarFile.getParent();
}
destDir = destDir.endsWith(File.separator) ? destDir : destDir + File.separator;
return unTar(new GzipCompressorInputStream(new FileInputStream(tarFile)), destDir);
}
public static List<String> unTarGZ(String file, String destDir) throws Exception {
File tarFile = new File(file);
return unTarGZ(tarFile, destDir);
}
public static void createDirectory(String outputDir, String subDir) {
File file = new File(outputDir);
if (!(subDir == null || subDir.trim().equals(""))) {//子目录不为空
file = new File(outputDir + File.separator + subDir);
}
if (!file.exists()) {
file.mkdirs();
}
}
public static List<String> unZip(File zipfile, String destDir) throws Exception {
if (StringUtils.isBlank(destDir)) {
destDir = zipfile.getParent();
}
destDir = destDir.endsWith(File.separator) ? destDir : destDir + File.separator;
ZipArchiveInputStream is = null;
List<String> fileNames = new ArrayList<String>();
try {
is = new ZipArchiveInputStream(new BufferedInputStream(new FileInputStream(zipfile), BUFFER_SIZE));
ZipArchiveEntry entry = null;
while ((entry = is.getNextZipEntry()) != null) {
fileNames.add(entry.getName());
if (entry.isDirectory()) {
File directory = new File(destDir, entry.getName());
directory.mkdirs();
} else {
OutputStream os = null;
try {
os = new BufferedOutputStream(new FileOutputStream(new File(destDir, entry.getName())), BUFFER_SIZE);
IOUtils.copy(is, os);
} finally {
IOUtils.closeQuietly(os);
}
}
}
} catch (Exception e) {
e.printStackTrace();
throw e;
} finally {
IOUtils.closeQuietly(is);
}
return fileNames;
}
public static List<String> unZip(String zipfile, String destDir) throws Exception {
File zipFile = new File(zipfile);
return unZip(zipFile, destDir);
}
public static List<String> unRar(String rarfile, String destDir) throws Exception {
List<String> fileNames = new ArrayList<String>();
try {
// 系统安装winrar的路径
String cmd = "C:\\Program Files\\WinRAR\\WinRAR.exe";
String unrarCmd = cmd + " x -r -p- -o+ " + rarfile + " " + destDir;
Runtime rt = Runtime.getRuntime();
Process pre = rt.exec(unrarCmd);
InputStreamReader isr = new InputStreamReader(pre.getInputStream());
BufferedReader bf = new BufferedReader(isr);
String line = null;
while ((line = bf.readLine()) != null) {
line = line.trim();
if ("".equals(line)) {
continue;
}
System.out.println(line);
}
bf.close();
fileNames.add("成功");
} catch (Exception e) {
System.out.println("解压发生异常");
}
return fileNames;
}
/**
* 解压方法
* @param compressFile 解压文件
* @param destDir 解压到的文件夹
* @return
* @throws Exception
*/
public static List<String> unCompress(String compressFile, String destDir) throws Exception {
String upperName = compressFile.toUpperCase();
List<String> ret = null;
if (upperName.endsWith(".ZIP")) {
ret = unZip(compressFile, destDir);
} else if (upperName.endsWith(".TAR")) {
ret = unTar(compressFile, destDir);
} else if (upperName.endsWith(".TAR.BZ2")) {
ret = unTarBZip2(compressFile, destDir);
} else if (upperName.endsWith(".BZ2")) {
ret = unBZip2(compressFile, destDir);
} else if (upperName.endsWith(".TAR.GZ")) {
ret = unTarGZ(compressFile, destDir);
} else if (upperName.endsWith(".GZ")) {
ret = unGZ(compressFile, destDir);
} else {
ret = unRar(compressFile,destDir);
}
return ret;
}
}