前言
日常使用中有解压软件可以解压压缩包,但是生产中一般都是代码完成。
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 {@Testpublic 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.结果展示
其中一个压缩文件的内容:
解压以后:
5.结语
junrar 的包有缺陷
其一:如果压缩文件中有中文名字的文件夹,解压以后文件夹名字是乱码,但是不影响文件夹里面的文件;
其二:最新 WinRar 压缩产生的 .rar 文件可能会无法解压。
缺陷原因:rar 有版权,有些东西没有公开,对解压有一些限制,即使其他解压包也可能有问题,但是建议尝试。