內容簡介
本文主要介紹使用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 }