java批量解压文件夹下的所有压缩文件(.rar、.zip、.gz、.tar.gz)

时间:2021-08-16 11:50:44
// java批量解压文件夹下的所有压缩文件(.rar、.zip、.gz、.tar.gz)

 新建工具类:

 
 
package com.mobile.utils;

import com.github.junrar.Archive;
import com.github.junrar.rarfile.FileHeader;
import org.apache.tools.tar.TarEntry;
import org.apache.tools.tar.TarInputStream;

import java.io.*;
import java.nio.charset.Charset;
import java.util.Enumeration;
import java.util.zip.GZIPInputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

/**
* @Description: UnzipUtil 工具类
* @Param:
* @return:
* @Author: mufeng
* @Date: 2018/8/20
*/
public class UnzipUtil {

//解压.zip文件
public static void unZip(String sourceFile, String outputDir) throws IOException {
ZipFile zipFile = null;
File file = new File(sourceFile);
try {
Charset CP866 = Charset.forName("CP866"); //specifying alternative (non UTF-8) charset
zipFile = new ZipFile(file, CP866);
createDirectory(outputDir,null);//创建输出目录

Enumeration<?> enums = zipFile.entries();
while(enums.hasMoreElements()){

ZipEntry entry = (ZipEntry) enums.nextElement();
System.out.println("解压." + entry.getName());

if(entry.isDirectory()){//是目录
createDirectory(outputDir,entry.getName());//创建空目录
}else{//是文件
File tmpFile = new File(outputDir + "/" + entry.getName());
createDirectory(tmpFile.getParent() + "/",null);//创建输出目录

InputStream in = null;
OutputStream out = null;
try{
in = zipFile.getInputStream(entry);;
out = new FileOutputStream(tmpFile);
int length = 0;

byte[] b = new byte[2048];
while((length = in.read(b)) != -1){
out.write(b, 0, length);
}

}catch(IOException ex){
throw ex;
}finally{
if(in!=null)
in.close();
if(out!=null)
out.close();
}
}
}

} catch (IOException e) {
throw new IOException("解压缩文件出现异常",e);
} finally{
try{
if(zipFile != null){
zipFile.close();
}
}catch(IOException ex){
throw new IOException("关闭zipFile出现异常",ex);
}
}
}

/**
* 构建目录
* @param outputDir
* @param subDir
*/
public static void createDirectory(String outputDir,String subDir){
File file = new File(outputDir);
if(!(subDir == null || subDir.trim().equals(""))){//子目录不为空
file = new File(outputDir + "/" + subDir);
}
if(!file.exists()){
if(!file.getParentFile().exists())
file.getParentFile().mkdirs();
file.mkdirs();
}
}


//解压.rar文件
public static void unRar(String sourceFile, String outputDir) throws Exception {
Archive archive = null;
FileOutputStream fos = null;
File file = new File(sourceFile);
try {
archive = new Archive(file);
FileHeader fh = archive.nextFileHeader();
int count = 0;
File destFileName = null;
while (fh != null) {
System.out.println((++count) + ") " + fh.getFileNameString());
String compressFileName = fh.getFileNameString().trim();
destFileName = new File(outputDir + "/" + compressFileName);
if (fh.isDirectory()) {
if (!destFileName.exists()) {
destFileName.mkdirs();
}
fh = archive.nextFileHeader();
continue;
}
if (!destFileName.getParentFile().exists()) {
destFileName.getParentFile().mkdirs();
}
fos = new FileOutputStream(destFileName);
archive.extractFile(fh, fos);
fos.close();
fos = null;
fh = archive.nextFileHeader();
}

archive.close();
archive = null;
} catch (Exception e) {
throw e;
} finally {
if (fos != null) {
try {
fos.close();
fos = null;
} catch (Exception e) {
//ignore
}
}
if (archive != null) {
try {
archive.close();
archive = null;
} catch (Exception e) {
//ignore
}
}
}
}


//解压.gz文件
public static void unGz(String sourceFile, String outputDir) {
String ouputfile = "";
try {
//建立gzip压缩文件输入流
FileInputStream fin = new FileInputStream(sourceFile);
//建立gzip解压工作流
GZIPInputStream gzin = new GZIPInputStream(fin);
//建立解压文件输出流
/*ouputfile = sourceFile.substring(0,sourceFile.lastIndexOf('.'));
ouputfile = ouputfile.substring(0,ouputfile.lastIndexOf('.'));*/
File file = new File(sourceFile);
String fileName = file.getName();
outputDir = outputDir + "/" + fileName.substring(0, fileName.lastIndexOf('.'));
FileOutputStream fout = new FileOutputStream(outputDir);

int num;
byte[] buf=new byte[1024];

while ((num = gzin.read(buf,0,buf.length)) != -1)
{
fout.write(buf,0,num);
}

gzin.close();
fout.close();
fin.close();
} catch (Exception ex){
System.err.println(ex.toString());
}
return;
}


//解压.tar.gz文件
public static void unTarGz(String sourceFile,String outputDir) throws IOException{
TarInputStream tarIn = null;
File file = new File(sourceFile);
try{
tarIn = new TarInputStream(new GZIPInputStream(
new BufferedInputStream(new FileInputStream(file))),
1024 * 2);

createDirectory(outputDir,null);//创建输出目录

TarEntry entry = null;
while( (entry = tarIn.getNextEntry()) != null ){

if(entry.isDirectory()){//是目录
entry.getName();
createDirectory(outputDir,entry.getName());//创建空目录
}else{//是文件
File tmpFile = new File(outputDir + "/" + entry.getName());
createDirectory(tmpFile.getParent() + "/",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);
}

}catch(IOException ex){
throw ex;
}finally{

if(out!=null)
out.close();
}
}
}
}catch(IOException ex){
throw new IOException("解压归档文件出现异常",ex);
} finally{
try{
if(tarIn != null){
tarIn.close();
}
}catch(IOException ex){
throw new IOException("关闭tarFile出现异常",ex);
}
}
}

public static void main(String[] args) throws Exception {
//测试解压文件(1. .zip 2. .rar 3. .gz 4. .tar.gz)
String gzPath = "E:\\project11_LogAnalysis\\dc.weilianupup.com_2018_08_07_110000_120000.gz";
String zipPath = "E:\\project11_LogAnalysis\\*-3.4.3.zip";
String tarGzPath = "E:\\project11_LogAnalysis\\nginx-1.12.0.tar.gz";
String rarPath = "E:\\project11_LogAnalysis\\test.rar";

String outputDir = "E:\\project11_LogAnalysis\\test";

// 传入参数(待解压的压缩文件路径, 解压文件到的目标文件夹)
// unZip(zipPath, outputDir);
// unGz(gzPath, outputDir);
// unTarGz(tarGzPath, outputDir);
unRar(rarPath, outputDir);

}

}
 

 

调用工具类,实现批量解压:

package com.mobile.web.api;

import com.mobile.commons.JsonResp;
import com.mobile.model.LogInfo;
import com.mobile.service.LogInfoService;
import com.mobile.utils.UnzipUtil;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.io.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;


@RestController
@RequestMapping(value = "/test")
@Transactional
public class ImportController {
    Logger log = Logger.getLogger(this.getClass());

    @Autowired
    private LogInfoService logInfoService;


    @RequestMapping(value = "/unZipFiles", method = RequestMethod.POST)
    public JsonResp unZipFiles(@RequestBody Map map) throws Exception {
        log.debug("批量解压指定文件夹下的压缩文件文件至另一指定文件夹下");

        String sourceDir = map.get("sourceDir").toString();
        String outputDir = map.get("outputDir").toString();
        File file = new File(sourceDir);
        List<File> sourceFile = new ArrayList();
        listFiles(file, sourceFile);
        for (File file2 : sourceFile){
            String fileName = file2.getName();
            String fileType = fileName.substring(fileName.lastIndexOf("."));
            if (".gz".equals(fileType)){
                fileName = fileName.substring(0, fileName.lastIndexOf("."));
                String fileType2 = fileName.substring(fileName.lastIndexOf("."));
                if (".tar".equals(fileType2)){
                    fileType = ".tar.gz";
                }
            }
            String fileSource = file2.getAbsolutePath();
            switch(fileType){
                case ".gz" : UnzipUtil.unGz(fileSource, outputDir);  break;       //解压压缩文件
                case ".zip" : UnzipUtil.unZip(fileSource, outputDir); break;
                case ".tar.gz" : UnzipUtil.unTarGz(fileSource, outputDir); break;
                case ".rar" : UnzipUtil.unRar(fileSource, outputDir); break;        //解压rar文件时,暂时有问题
                default: log.debug(fileSource + ": 此文件无法解压");
            }
//            file2.delete();           //解压完后,是否删除
        }
        return JsonResp.ok();
    }

    //循环出文件夹下的所有压缩文件
    public static void listFiles(File file, List<File> sourceFile){

        if(file.isDirectory()){
            File[] files = file.listFiles();
            for (File file1 : files){
                if(file1.isDirectory()){    //若是目录,则递归该目录下的文件
                    listFiles(file1, sourceFile);
                }else if (file1.isFile()){
                    sourceFile.add(file1);  //若是文件,则保存
                }
            }
        }

    }

 

 

参考: https://www.cnblogs.com/scw2901/p/4379143.html

       https://blog.csdn.net/u012100371/article/details/75029961