java 提取(解壓)rar文件中特定后綴的文件並保存到指定目錄


內容簡介

本文主要介紹使用junrar來提取rar壓縮文件中特定后綴(如:png,jpg)的文件並保存到指定目錄下。

支持v4及以下版本壓縮文件,不支持v5及以上。

在rar文件上右鍵,查看屬性,在壓縮文件標簽頁下,可以看到壓縮算法版本,如下圖:

 

壓縮時,選擇使用RAR4版本來壓縮,如下圖:

junrar

在GitHub中的地址:https://github.com/junrar/junrar

在Pom文件中的引用

<dependency>
      <groupId>com.github.junrar</groupId>
      <artifactId>junrar</artifactId>
      <version>4.0.0</version>
</dependency>

 實現代碼(僅供參考,請根據實現情況來修改)

/**
 * 將壓縮文件中指定后綴名稱的文件解壓到指定目錄
 * @param compressFile 壓縮文件
 * @param baseDirectory 解壓到的基礎目錄(在此目錄下創建UUID的目錄,存入解壓的文件)
 * @param decompressSuffs 要提取文件的后綴名
 * @return
 */
@Override
public void decompressToDirectory(File compressFile, String baseDirectory, List<String> decompressSuffs) throws Exception{
    List<AttachFile> attachFileList = new ArrayList<>();

    //驗證壓縮文件
    boolean isFile = compressFile.isFile();
    if (!isFile){
        System.out.println(String.format("compressFile非文件格式!",compressFile.getName()));
        return null;
    }
    String compressFileSuff = FileUtil.getFileSuffix(compressFile.getName()).toLowerCase();
    if (!compressFileSuff.equals("rar")){
        System.out.println(String.format("[%s]文件非rar類型的壓縮文件!",compressFile.getName()));
        return null;
    }

    //region 解壓縮文件(rar)
    Archive archive = null;
    try{
        archive = new Archive(compressFile,null);
        if (archive == null){return null;}
        FileHeader fh = archive.nextFileHeader();
        while (fh!=null){
            if (fh.isDirectory()) { // 文件夾
                continue;
            }
            else{
                String rarEntryName = fh.getFileNameW().trim().equals("") ? fh.getFileNameString().trim() : fh.getFileNameW().trim();
                //過濾非指定后綴文件
                String suff = FileUtil.getFileSuffix(rarEntryName).toLowerCase();
                if (decompressSuffs != null && decompressSuffs.size() > 0){
                    if (decompressSuffs.stream().filter(s->s.equals(suff)).collect(Collectors.toList()).size() <= 0){
                        fh = archive.nextFileHeader();
                        continue;
                    }
                }
                //創建解壓目錄(如果復制的代碼,這里會報錯,沒有StrUtil,這里就是創建了一個目錄來存儲提取的文件,你可以換其他方式來創建目錄)
                String groupId = StrUtil.getUUID();
                File group = new File(baseDirectory + groupId);
                if(!group.exists()){
                    group.mkdirs();
                }
                String outPath = (baseDirectory + groupId + File.separator + rarEntryName).replaceAll("\\*", "/");
                File out = new File(outPath);
                FileOutputStream os = new FileOutputStream(out);
                archive.extractFile(fh, os);
                os.close();

            }
            fh = archive.nextFileHeader();
        }
    }
    catch (Exception e){
        e.printStackTrace();
    }
    finally {
        archive.close();
    }
    //endregion
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM