当前位置:   article > 正文

[java]使用junrar解压文件时,上报解压进度的具体实现_import com.github.junrar.volume;

import com.github.junrar.volume;

笔者在公司项目中有一个需要解压10G的rar的压缩包的一个需求,那么我们希望能够上报整个解压的进度。google/baidu上均没有找到合适的办法。后来看了下junrar的源码,发现实现UnrarCallback接口后,可以完成进度的上报监测。

经验之谈就是,读源码才是王道。

具体代码可点击Github地址

监控类具体代码如下。

package com.zju.javastudy.unrar;

import com.github.junrar.UnrarCallback;
import com.github.junrar.Volume;
import com.github.junrar.impl.FileVolume;

import java.io.IOException;

/**
 * @author Arthur
 * @Date 11/04/2018
 * @Decription:
 */
public class UnrarProcessMonitor implements UnrarCallback{

    private String fileName;

    public UnrarProcessMonitor(String fileName) {
        this.fileName = fileName;
    }

    /**
     * 返回false的话,对于某些分包的rar是没办法解压正确的
     * */
    @Override
    public boolean isNextVolumeReady(Volume volume) {
        try {
            fileName = ((FileVolume) volume).getFile().getCanonicalPath();
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    @Override
    public void volumeProgressChanged(long l, long l1) {
        //输出进度
        System.out.println("Unrar "+fileName+" rate: "+(double)l/l1*100+"%");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

解压代码如下:

package com.zju.javastudy.unrar;

import com.github.junrar.Archive;
import com.github.junrar.exception.RarException;
import com.github.junrar.exception.RarException.RarExceptionType;
import com.github.junrar.rarfile.FileHeader;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.List;

/**
 * @author Arthur
 * @Date 11/04/2018
 * @Decription:
 */


public class UnRarDemo {

    /**
     * @param rarFileName rar file name
     * @param outFilePath output file path
     * @return success Or Failed
     * @author zhuss
     * @throws Exception
     */
    public static boolean  unrar(String rarFileName, String outFilePath)  throws  Exception{

        try  {
            Archive archive = new  Archive(new File(rarFileName), new UnrarProcessMonitor(rarFileName));
            if(archive == null){
                throw new FileNotFoundException(rarFileName + " NOT FOUND!");
            }
            if(archive.isEncrypted()){
                throw new Exception(rarFileName + " IS ENCRYPTED!");
            }
            List<FileHeader> files =  archive.getFileHeaders();
            for (FileHeader fh : files) {
                if(fh.isEncrypted()){
                    throw new Exception(rarFileName + " IS ENCRYPTED!");
                }
                String fileName = fh.getFileNameW();
                if(fileName != null && fileName.trim().length() > 0){
                    String saveFileName = outFilePath+File.separator+fileName;
                    File saveFile = new File(saveFileName);
                    File parent =  saveFile.getParentFile();
                    if(!parent.exists()){
                        parent.mkdirs();
                    }
                    if(!saveFile.exists()){
                        saveFile.createNewFile();
                    }
                    FileOutputStream fos = new FileOutputStream(saveFile);
                    try {
                        archive.extractFile(fh, fos);
                        fos.flush();
                        fos.close();
                    } catch (RarException e) {
                        if(e.getType().equals(RarExceptionType.notImplementedYet)){
                        }
                    }finally{
                    }
                }
            }
            return true;
        } catch  (Exception e) {
            System.out.println("failed.");
            return false;
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73

测试代码:

 public static void main(String[] args) throws Exception {
        System.out.println("unrar result:"+unrar("/Users/arthur/Desktop/Books/193.rar","/Users/arthur/Desktop/Books/"));
    }
  • 1
  • 2
  • 3

结果截图:
这里写图片描述

当然了,笔者这个仅仅是一个demo,这个进度应当做一下格式化处理,这里不再赘述了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/388112
推荐阅读
相关标签
  

闽ICP备14008679号