• Java实现rar解压


    jar包下载地址

    https://mvnrepository.com/artifact/com.github.junrar/junrar

    UnRarUtils.java

    import com.github.junrar.Archive;
    import com.github.junrar.UnrarCallback;
    import com.github.junrar.exception.RarException;
    import com.github.junrar.rarfile.FileHeader;
     
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.math.BigInteger;
    import java.security.MessageDigest;
    import java.util.List;
     
    public class UnRarUtils {
     
        /**
         * @param rarFileName rar file name
         * @param outFilePath output file path
         * @param callback callback
         * @author shijian
         * @throws Exception
         */
        public static void unrar(String rarFileName, String outFilePath, UnrarCallback callback) throws Exception {
            Archive archive = new Archive(new File(rarFileName), callback);
            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.getFileNameString();
                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);
                    } catch (RarException e) {
                        throw e;
                    }finally{
                        try{
                            fos.flush();
                            fos.close();
                        }catch (Exception e){
                        }
                    }
                }
            }
        }
     
        /**
         * 获取单个文件的MD5值!
         * @param file
         * @return
         */
        public static String getFileMD5(File file) {
            if (!file.isFile()) {
                return null;
            }
            MessageDigest digest = null;
            FileInputStream in = null;
            byte buffer[] = new byte[1024];
            int len;
            try {
                digest = MessageDigest.getInstance("MD5");
                in = new FileInputStream(file);
                while ((len = in.read(buffer, 0, 1024)) != -1) {
                    digest.update(buffer, 0, len);
                }
                in.close();
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
            BigInteger bigInt = new BigInteger(1, digest.digest());
            return bigInt.toString(16);
        }
    }

      

    使用

    UnRarUtils.unrar(rarFile.getAbsolutePath(), sdDir.getAbsolutePath(), new UnrarCallback() {
            int currentProgress = -1;
            @Override
            public boolean isNextVolumeReady(Volume volume) {
                return true;
            }
            @Override
            public void volumeProgressChanged(long l, long l1) {
                int progress = (int)((double)l/l1*100);
                if(currentProgress != progress){
                    currentProgress = progress;
                    LogUtils.addLog(context,TAG,"Unrar "+rarFile.getName()+" rate: "+progress+"%");
                }
            }
        });
  • 相关阅读:
    多态
    多继承
    传宗接代——继承
    解决vue项目更新版本后浏览器的缓存问题
    escape()、encodeURI()、encodeURIComponent()三种编码方式的区别
    epoll使用总结
    探讨c/c++的指针
    基于linux的pthread_t封装一个Thread类
    unix高并发编程中遇到的问题和笔记
    面向对象分析与设计 实验七
  • 原文地址:https://www.cnblogs.com/interdrp/p/15591528.html
Copyright © 2020-2023  润新知