zip、rar格式文件解壓縮處理

zip、rar格式文件解壓縮處理

在相關業務場景中,批量文件處理,需要預先進行解壓縮及拷貝處理

核心pom依賴引入

<!-- 導入zip解壓包 -->
<dependency>
    <groupId>ant</groupId>
    <artifactId>ant</artifactId>
    <version>1.6.5</version>
</dependency>
<!-- 導入rar解壓包 -->
<dependency>
    <groupId>com.github.junrar</groupId>
    <artifactId>junrar</artifactId>
    <version>4.0.0</version>
</dependency>
<dependency>
    <groupId>com.github.jnr</groupId>
    <artifactId>jnr-posix</artifactId>
    <version>3.0.50</version>
</dependency>

核心工具類FileUtil.java

public static boolean unPackagedFile(String filename,String dir){
    InfDecompress rarDecompress = null;
    if(filename.endsWith(".rar")){
        rarDecompress = new RarDecompress();   //需要用rar4格式的壓縮包能被解析,高版本不行
    }else if(filename.endsWith(".zip")){
        rarDecompress = new ZipDecompress();
    }else{
        logger.error("不支持的解包擴展名格式");
        return false;
    }

    if(!rarDecompress.decompressFile(filename,dir)){
        logger.error(filename + "解壓失敗");
        return false;
    }
    return true;
}

public static int copyFilesOfDir(String srcDirPath, String desDirPath) {
    if (!srcDirPath.endsWith(File.separator)) {
        srcDirPath = srcDirPath + File.separator;
    }
    if (!desDirPath.endsWith(File.separator)) {
        desDirPath = desDirPath + File.separator;
    }
    File srcfile = new File(srcDirPath);
    if (srcfile.exists()) {
        String[] fileNames = srcfile.list();
        //及時是個空目錄 也要創建一個空的目標目錄
        if (fileNames != null) {
            if (!new File(desDirPath).exists()) {
                if (!new File(desDirPath).mkdirs()) {
                    logger.error("{failed to mkdirs " + desDirPath + "}");
                    return -1;
                }
            }
        }
        else {
            return -1;
        }
        for (String fileName : fileNames) {
            File fileToCopy = null;
            if (srcDirPath.endsWith(File.separator)) {
                fileToCopy = new File(srcDirPath + fileName);
            } else {
                fileToCopy = new File(srcDirPath + File.separator + fileName);
            }
            if (fileToCopy.isFile()) {
                //copy file
                FileInputStream inputStream = null;
                FileOutputStream outputStream = null;
                try {
                    inputStream = new FileInputStream(fileToCopy);
                    if (desDirPath.endsWith(File.separator)) {
                        outputStream = new FileOutputStream(desDirPath + fileToCopy.getName());
                    } else {
                        outputStream = new FileOutputStream(desDirPath + File.separator + fileToCopy.getName());
                    }
                    byte[] buffer = new byte[10240];
                    int len;
                    while ((len = inputStream.read(buffer)) != -1) {
                        outputStream.write(buffer, 0, len);
                    }
                    outputStream.flush();
                    outputStream.close();
                    inputStream.close();
                } catch (FileNotFoundException ex) {
                    logger.error(ex.getMessage());
                    return -1;
                } catch (IOException ex) {
                    logger.error(ex.getMessage());
                    return -1;
                } finally {

                }
            } else {
                continue;
            }

        }

    }
    return 0;
}

public static int copyFile(String srcFileNm,String DesFileNm)
{
    InputStream input = null;
    OutputStream output = null;
    try{
        File inFile = new File(srcFileNm);
        File outFile = new File(DesFileNm);
        /*if(!outFile.exists())
            outFile.createNewFile();*/
        input = new FileInputStream(inFile);
        output = new FileOutputStream(outFile);
        byte[] buf = new byte[1024];
        int bytesRead;
        while ((bytesRead = input.read(buf)) > 0) {
            output.write(buf, 0, bytesRead);
        }
    }catch (Exception e){
        logger.error("copyFileToDstdir 文件拷貝失敗,src:" + srcFileNm + "  dst:" + DesFileNm + "errorMsg:" + e.getLocalizedMessage());
        return -1;
    }finally {
        try{
            if(input != null){
                input.close();
            }
            if(output != null){
                output.close();
            }
        }catch (IOException e){
            logger.error(e.getMessage());
        }
    }

    return 0;

}

public static int deleteDirRecursively(String absoluteDirPath)
{
    File dir=new File(absoluteDirPath);
    if(!dir.isDirectory())
    {
        if(!dir.delete())
        {
            logger.error("delete file failed "+ dir.getAbsolutePath());
            return -1;
        }
        return 0;
    }
    else
    {
        String[] fileList=dir.list();
        for(String fileName:fileList)
        {
            String absolutePath=absoluteDirPath+File.separator+fileName;
            if(deleteDirRecursively(absolutePath)<0)
            {
                logger.error("delete file failed "+absolutePath);
                return -1;
            }
        }
        if(fileList.length==0)
        {
            if(!dir.delete())
            {
                logger.error(dir.getAbsolutePath()+" delele failed");
                return -1;
            }
        }
    }
    return 0;
}

/**
     * 從fileName全路徑中,獲取文件名稱
     * @param fileName
     * @return
     */
public static String getIndexOfFile(String fileName){
   if(fileName == null){
       return fileName;
   }
   if(fileName.lastIndexOf("\\") != -1){
       return fileName.substring(fileName.lastIndexOf("\\")+1);
   }
   if(fileName.lastIndexOf("/") != -1){
       return fileName.substring(fileName.lastIndexOf("/")+1);
   }
   return fileName;
}

統一接口

public interface InfDecompress {
    boolean decompressFile(String fn,String dest);
}

rar格式解壓縮處理

import com.github.junrar.Archive;
import com.github.junrar.rarfile.FileHeader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;

public class RarDecompress implements InfDecompress{
    private static Logger logger = LoggerFactory.getLogger(RarDecompress.class);

    @Override
    public boolean decompressFile(String fn,String dest) {
        Archive a = null;

        try {
            File inFile = new File(fn);
            a = new Archive(new FileInputStream(inFile));
            if(a!=null){
                FileHeader fh = a.nextFileHeader();
                while(fh != null){
                    if(fh.isDirectory()){
                        File fol = new File(dest + File.separator + fh.getFileNameString());
                        fol.mkdirs();
                    }else{
                        String unpackFile = dest + File.separator + fh.getFileNameString().trim();
                        File out = new File(unpackFile);
                        if(!out.exists()){
                            if (!out.getParentFile().exists()) {// 相對路徑可能多級,可能需要創建父目錄.
                                out.getParentFile().mkdirs();
                            }
                            out.createNewFile();
                        }
                        FileOutputStream os = new FileOutputStream(out);
                        a.extractFile(fh, os);
                        os.close();
                        if(unpackFile.endsWith(".rar") || unpackFile.endsWith(".zip")){  //子文件下還有被壓縮的文件
                            UnPackage.unPackagedFile(unpackFile,unpackFile.substring(0,unpackFile.lastIndexOf(File.separator)));
                        }
                    }
                    fh = a.nextFileHeader();
                }
            }else {
                logger.error("Rar decompressFile異常");
                return false;
            }
            a.close();
            return true;
        }catch (Exception e){
            logger.error("解壓" + fn + "文件失敗" + e.getLocalizedMessage());
        }
        return false;
    }
}

zip格式解壓縮處理

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;

public class ZipDecompress implements InfDecompress{
    private static Logger logger = LoggerFactory.getLogger(ZipDecompress.class);

    @Override
    public boolean decompressFile(String fn,String dest) {
        try {
            ZipFile zip = new ZipFile(fn,"gbk");
            for (Enumeration entries = zip.getEntries(); entries.hasMoreElements(); ) {
                ZipEntry entry = (ZipEntry) entries.nextElement();
                String zipEntryName = entry.getName();
                String unpackFile = dest + File.separator + zipEntryName.trim();
                InputStream in = zip.getInputStream(entry);
                OutputStream out = new FileOutputStream(dest + File.separator + zipEntryName);
                if (new File(zipEntryName).isDirectory()) {
                    continue;
                }
                byte[] buf1 = new byte[1024];
                int len;
                while ((len = in.read(buf1)) > 0) {
                    out.write(buf1, 0, len);
                }
                in.close();
                out.close();
                if(unpackFile.endsWith(".rar") || unpackFile.endsWith(".zip")){  //子文件下還有被壓縮的文件
                    UnPackage.unPackagedFile(unpackFile,unpackFile.substring(0,unpackFile.lastIndexOf(File.separator)));
                }
            }
            zip.close();
        }catch (Exception e){
            logger.error("Zip decompressFile異常");
            return false;
        }

        return true;
    }
}

學習Java的同學注意了!!!
學習過程中遇到什麼問題或者想獲取學習資源的話,歡迎加入Java學習交流羣,羣號碼:543120397 我們一起學Java!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章