1. 程式人生 > 其它 >JAVA開發示例:ZIP檔案、RAR檔案的解壓

JAVA開發示例:ZIP檔案、RAR檔案的解壓

新增依賴

RAR5的解壓需要新增依賴

 <dependency>
     <groupId>com.github.axet</groupId>
     <artifactId>java-unrar</artifactId>
     <version>1.7.0-8</version>
 </dependency>
 <dependency>
     <groupId>net.sf.sevenzipjbinding</groupId>
     <artifactId>sevenzipjbinding</artifactId>
     <version>16.02-2.01</version>
 </dependency>
 <dependency>
     <groupId>net.sf.sevenzipjbinding</groupId>
     <artifactId>sevenzipjbinding-all-platforms</artifactId>
     <version>16.02-2.01</version>
 </dependency>

關閉流用到一個IOUtils類,需新增

<dependency>
     <groupId>org.apache.commons</groupId>
     <artifactId>commons-compress</artifactId>
     <version>1.19</version>
 </dependency>

程式碼示例

package com.bsmn.util;

import net.sf.sevenzipjbinding.ExtractAskMode;
import net.sf.sevenzipjbinding.ExtractOperationResult;
import net.sf.sevenzipjbinding.IArchiveExtractCallback;
import net.sf.sevenzipjbinding.IInArchive;
import net.sf.sevenzipjbinding.ISequentialOutStream;
import net.sf.sevenzipjbinding.PropID;
import net.sf.sevenzipjbinding.SevenZip;
import net.sf.sevenzipjbinding.SevenZipException;
import net.sf.sevenzipjbinding.impl.RandomAccessFileInStream;
import org.apache.commons.compress.utils.IOUtils;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.RandomAccessFile;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public class FileUtil {

    public static List<File> unrar(File rarFile, File targetDir) {
        List<File> targetFiles = new ArrayList<>();
        try {
            if(!targetDir.exists()){
               targetDir.mkdirs();
            }
            RandomAccessFile randomAccessFile = new RandomAccessFile(rarFile, "r");
            IInArchive archive = SevenZip.openInArchive(null,new RandomAccessFileInStream(randomAccessFile));
            int[] in = new int[archive.getNumberOfItems()];
            for (int i = 0; i < in.length; i++) {
                in[i] = i;
            }
            archive.extract(in, false, getExtractCallback(archive,targetDir,targetFiles));
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return targetFiles;
    }

    private static IArchiveExtractCallback getExtractCallback(IInArchive inArchive,File targetDir,List<File> targetFiles){
        return new IArchiveExtractCallback(){
            @Override
            public void setTotal(long l) throws SevenZipException {}

            @Override
            public void setCompleted(long l) throws SevenZipException {}

            @Override
            public ISequentialOutStream getStream(int index, ExtractAskMode extractAskMode) throws SevenZipException {
                final String path = (String) inArchive.getProperty(index, PropID.PATH);
                final boolean isFolder = (boolean) inArchive.getProperty(index, PropID.IS_FOLDER);
                return data -> {
                    try {
                        if (!isFolder) {
                            File file = new File(targetDir,path);

                            Files.write(file.toPath(),data);
                            targetFiles.add(file);
                        }else{
                            File file = new File(targetDir ,  path);
                            if(!file.exists()){
                                file.mkdirs();
                            }
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    return data.length;
                };
            }

            @Override
            public void prepareOperation(ExtractAskMode extractAskMode) throws SevenZipException {}

            @Override
            public void setOperationResult(ExtractOperationResult extractOperationResult) throws SevenZipException {}
        };
    }

    public static List<File> unzip(InputStream inputStream, File targetDir)  {
        List<File> targetFiles = new ArrayList<>();
        ZipInputStream zipInputStream = null;
        try {
            if(!targetDir.exists()){
                targetDir.mkdirs();
            }
            zipInputStream = new ZipInputStream(inputStream);
            String entryName = null;
            byte[] buf = new byte[4096];
            int readByte = 0;
            ZipEntry fentry=null;
            File tempFile;
            while((fentry=zipInputStream.getNextEntry())!=null){
                entryName = fentry.getName();
                if (fentry.isDirectory()) {
                    tempFile = new File(targetDir,entryName);
                    if(!tempFile.exists()){
                        tempFile.mkdirs();
                    }
                    continue;
                }
                File file = new File(targetDir,entryName);
                OutputStream os = new FileOutputStream(file);
                while((readByte=zipInputStream.read(buf))!=-1){
                    os.write(buf, 0, readByte);
                }
                IOUtils.closeQuietly(os);
                targetFiles.add(file);
            }
        } catch (Exception e) {
            throw new RuntimeException("unzip file error",e);
        }finally {
            IOUtils.closeQuietly(zipInputStream);
        }
        return targetFiles;
    }
}

參考資料

https://www.cnblogs.com/zhufanfan/p/15016717.html