前言

日常使用中有解压软件可以解压压缩包,但是生产中一般都是代码完成。

1.声明依赖(集成环境:IJ.IDEA)

<!-- 解压rar -->
        <dependency>
            <groupId>com.github.junrar</groupId>
            <artifactId>junrar</artifactId>
            <version>3.0.0</version>
        </dependency>

        <!-- 解压zip -->
        <dependency>
            <groupId>org.apache.ant</groupId>
            <artifactId>ant</artifactId>
            <version>1.9.4</version>
        </dependency>
        
        <!-- 单元测试 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

2.直接贴代码,把两个解压程序写到一个类里面

import com.github.junrar.Archive;
import com.github.junrar.rarfile.FileHeader;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;

import java.io.*;
import java.util.Enumeration;

public class UnZipAnRar {

    public static void unZip(File zipFile, String outDir) throws IOException {

        File outFileDir = new File(outDir);
        if (!outFileDir.exists()) {
            boolean isMakDir = outFileDir.mkdirs();
            if (isMakDir) {
                System.out.println("创建压缩目录成功");
            }
        }

        ZipFile zip = new ZipFile(zipFile);
        for (Enumeration enumeration = zip.getEntries(); enumeration.hasMoreElements(); ) {
            ZipEntry entry = (ZipEntry) enumeration.nextElement();
            String zipEntryName = entry.getName();
            InputStream in = zip.getInputStream(entry);

            if (entry.isDirectory()) {      //处理压缩文件包含文件夹的情况
                File fileDir = new File(outDir + zipEntryName);
                fileDir.mkdir();
                continue;
            }

            File file = new File(outDir, zipEntryName);
            file.createNewFile();
            OutputStream out = new FileOutputStream(file);
            byte[] buff = new byte[1024];
            int len;
            while ((len = in.read(buff)) > 0) {
                out.write(buff, 0, len);
            }
            in.close();
            out.close();
        }
    }

    public static void unRar(File rarFile, String outDir) throws Exception {
        File outFileDir = new File(outDir);
        if (!outFileDir.exists()) {
            boolean isMakDir = outFileDir.mkdirs();
            if (isMakDir) {
                System.out.println("创建压缩目录成功");
            }
        }
        Archive archive = new Archive(new FileInputStream(rarFile));
        FileHeader fileHeader = archive.nextFileHeader();
        while (fileHeader != null) {
            if (fileHeader.isDirectory()) {
                fileHeader = archive.nextFileHeader();
                continue;
            }
            File out = new File(outDir + fileHeader.getFileNameString());
            if (!out.exists()) {
                if (!out.getParentFile().exists()) {
                    out.getParentFile().mkdirs();
                }
                out.createNewFile();
            }
            FileOutputStream os = new FileOutputStream(out);
            archive.extractFile(fileHeader, os);

            os.close();

            fileHeader = archive.nextFileHeader();
        }
        archive.close();
    }
}

Notes:上面程序使用了两个工具包,其中解压 rar 文件的 junrar 可能会出现最新 winrar 软件的压缩包解压不了的情况,这种情况暂时没法处理,只能等待 junrar 更新。

3.测试代码

import org.junit.Test;

import java.io.File;
import java.io.IOException;

public class UnZipAnRarTest {
    @Test
    public void getUnZipAnnRarTest() {
        String originDir = "D:\\JavaPro\\TestFile\\";
        String zipPath = originDir + "test.zip";
        File zipFile = new File(zipPath);
        String rarPath = originDir + "new.rar";
        File rarFile = new File(rarPath);

        try {
            UnZipAnRar.unZip(zipFile, "D:\\JavaPro\\TestFile\\Test\\");
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            UnZipAnRar.unRar(rarFile, "D:\\JavaPro\\TestFile\\测试\\");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

4.结果展示

其中一个压缩文件的内容:

java poi解压rar文件名 java解压rar压缩包_rar


解压以后:

java poi解压rar文件名 java解压rar压缩包_java_02

5.结语
junrar 的包有缺陷
其一:如果压缩文件中有中文名字的文件夹,解压以后文件夹名字是乱码,但是不影响文件夹里面的文件;
其二:最新 WinRar 压缩产生的 .rar 文件可能会无法解压。
缺陷原因:rar 有版权,有些东西没有公开,对解压有一些限制,即使其他解压包也可能有问题,但是建议尝试。