• 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
    }
  • 相关阅读:
    Angular项目在npm install之后用ng serve启动发生错误
    (TODO)Angular的通道
    使用React+redux+Node.js+MongoDB开发(二)--使用redux
    Angular中使用DomSanitizer防范跨站脚本攻击类(XSS)的安全问题
    使用React+redux+Node.js+MongoDB开发(一)
    数组的数字和非数字下标的区别
    echarts绘制饼图时的一点特殊设置
    Angular项目中迭代生成的树,激活选中的节点,并将节点数据发送到父节点
    Ubuntu 设定壁纸自动切换的shell脚本
    Navicat for mysql linux 破解方法
  • 原文地址:https://www.cnblogs.com/codecat/p/11078485.html
Copyright © 2020-2023  润新知