java解压zip和rar文件

╰半橙微兮° 2022-05-10 14:36 396阅读 0赞

前言

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

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

  1. <!-- 解压rar -->
  2. <dependency>
  3. <groupId>com.github.junrar</groupId>
  4. <artifactId>junrar</artifactId>
  5. <version>3.0.0</version>
  6. </dependency>
  7. <!-- 解压zip -->
  8. <dependency>
  9. <groupId>org.apache.ant</groupId>
  10. <artifactId>ant</artifactId>
  11. <version>1.9.4</version>
  12. </dependency>
  13. <!-- 单元测试 -->
  14. <dependency>
  15. <groupId>junit</groupId>
  16. <artifactId>junit</artifactId>
  17. <version>4.12</version>
  18. <scope>test</scope>
  19. </dependency>

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

  1. import com.github.junrar.Archive;
  2. import com.github.junrar.rarfile.FileHeader;
  3. import org.apache.tools.zip.ZipEntry;
  4. import org.apache.tools.zip.ZipFile;
  5. import java.io.*;
  6. import java.util.Enumeration;
  7. public class UnZipAnRar {
  8. public static void unZip(File zipFile, String outDir) throws IOException {
  9. File outFileDir = new File(outDir);
  10. if (!outFileDir.exists()) {
  11. boolean isMakDir = outFileDir.mkdirs();
  12. if (isMakDir) {
  13. System.out.println("创建压缩目录成功");
  14. }
  15. }
  16. ZipFile zip = new ZipFile(zipFile);
  17. for (Enumeration enumeration = zip.getEntries(); enumeration.hasMoreElements(); ) {
  18. ZipEntry entry = (ZipEntry) enumeration.nextElement();
  19. String zipEntryName = entry.getName();
  20. InputStream in = zip.getInputStream(entry);
  21. if (entry.isDirectory()) { //处理压缩文件包含文件夹的情况
  22. File fileDir = new File(outDir + zipEntryName);
  23. fileDir.mkdir();
  24. continue;
  25. }
  26. File file = new File(outDir, zipEntryName);
  27. file.createNewFile();
  28. OutputStream out = new FileOutputStream(file);
  29. byte[] buff = new byte[1024];
  30. int len;
  31. while ((len = in.read(buff)) > 0) {
  32. out.write(buff, 0, len);
  33. }
  34. in.close();
  35. out.close();
  36. }
  37. }
  38. public static void unRar(File rarFile, String outDir) throws Exception {
  39. File outFileDir = new File(outDir);
  40. if (!outFileDir.exists()) {
  41. boolean isMakDir = outFileDir.mkdirs();
  42. if (isMakDir) {
  43. System.out.println("创建压缩目录成功");
  44. }
  45. }
  46. Archive archive = new Archive(new FileInputStream(rarFile));
  47. FileHeader fileHeader = archive.nextFileHeader();
  48. while (fileHeader != null) {
  49. if (fileHeader.isDirectory()) {
  50. fileHeader = archive.nextFileHeader();
  51. continue;
  52. }
  53. File out = new File(outDir + fileHeader.getFileNameString());
  54. if (!out.exists()) {
  55. if (!out.getParentFile().exists()) {
  56. out.getParentFile().mkdirs();
  57. }
  58. out.createNewFile();
  59. }
  60. FileOutputStream os = new FileOutputStream(out);
  61. archive.extractFile(fileHeader, os);
  62. os.close();
  63. fileHeader = archive.nextFileHeader();
  64. }
  65. archive.close();
  66. }
  67. }

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

3.测试代码

  1. import org.junit.Test;
  2. import java.io.File;
  3. import java.io.IOException;
  4. public class UnZipAnRarTest {
  5. @Test
  6. public void getUnZipAnnRarTest() {
  7. String originDir = "D:\\JavaPro\\TestFile\\";
  8. String zipPath = originDir + "test.zip";
  9. File zipFile = new File(zipPath);
  10. String rarPath = originDir + "new.rar";
  11. File rarFile = new File(rarPath);
  12. try {
  13. UnZipAnRar.unZip(zipFile, "D:\\JavaPro\\TestFile\\Test\\");
  14. } catch (IOException e) {
  15. e.printStackTrace();
  16. }
  17. try {
  18. UnZipAnRar.unRar(rarFile, "D:\\JavaPro\\TestFile\\测试\\");
  19. } catch (Exception e) {
  20. e.printStackTrace();
  21. }
  22. }
  23. }

4.结果展示

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

解压文件夹里面的内容

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

发表评论

表情:
评论列表 (有 0 条评论,396人围观)

还没有评论,来说两句吧...

相关阅读