当前位置:   article > 正文

Java解压RAR文件的几种方式

java解压rar文件

第一种:

  1. public class fileZipUtil {
  2. /**
  3. * zip文件解压
  4. * @param inputFile 待解压文件夹/文件
  5. * @param destDirPath 解压路径
  6. */
  7. public static void unZipFiles(String inputFile,String destDirPath) throws Exception {
  8. File srcFile = new File(inputFile);//获取当前压缩文件
  9. // 判断源文件是否存在
  10. if (!srcFile.exists()) {
  11. throw new Exception(srcFile.getPath() + "所指文件不存在");
  12. }
  13. ZipFile zipFile = new ZipFile(srcFile, Charset.forName("GBK"));//创建压缩文件对象
  14. //开始解压
  15. Enumeration<?> entries = zipFile.entries();
  16. while (entries.hasMoreElements()) {
  17. ZipEntry entry = (ZipEntry) entries.nextElement();
  18. // 如果是文件夹,就创建个文件夹
  19. if (entry.isDirectory()) {
  20. String dirPath = destDirPath + "/" + entry.getName();
  21. srcFile.mkdirs();
  22. } else {
  23. // 如果是文件,就先创建一个文件,然后用io流把内容copy过去
  24. File targetFile = new File(destDirPath + "/" + entry.getName());
  25. // 保证这个文件的父文件夹必须要存在
  26. if (!targetFile.getParentFile().exists()) {
  27. targetFile.getParentFile().mkdirs();
  28. }
  29. targetFile.createNewFile();
  30. // 将压缩文件内容写入到这个文件中
  31. InputStream is = zipFile.getInputStream(entry);
  32. FileOutputStream fos = new FileOutputStream(targetFile);
  33. int len;
  34. byte[] buf = new byte[1024];
  35. while ((len = is.read(buf)) != -1) {
  36. fos.write(buf, 0, len);
  37. }
  38. // 关流顺序,先打开的后关闭
  39. fos.close();
  40. is.close();
  41. }
  42. }
  43. }
  44. /**
  45. * 解压RAR压缩文件到指定路径
  46. * @param rarFile RAR压缩文件
  47. * @param dstDir 解压到的文件夹路径
  48. */
  49. public static void unRarFile(String rarPath, String dstDir) throws Exception {
  50. File dstDiretory = new File(dstDir);
  51. if (!dstDiretory.exists()) {
  52. dstDiretory.mkdirs();
  53. }
  54. try {
  55. File rarFile= new File(rarPath);
  56. Archive archive = new Archive(new FileInputStream(rarFile));
  57. List<FileHeader> fileHeaders = archive.getFileHeaders();
  58. for (FileHeader fileHeader : fileHeaders) {
  59. if (fileHeader.isDirectory()) {
  60. String fileName= fileHeader.getFileNameW();
  61. if(!existZH(fileName)){
  62. fileName = fileHeader.getFileNameString();
  63. }
  64. File dir = new File(dstDir + File.separator + fileName);
  65. if (!dir.exists()){
  66. dir.mkdirs();
  67. }
  68. } else {
  69. String fileName= fileHeader.getFileNameW().trim();
  70. if(!existZH(fileName)){
  71. fileName = fileHeader.getFileNameString().trim();
  72. }
  73. File file = new File(dstDir + File.separator + fileName);
  74. try {
  75. if (!file.exists()) {
  76. if (!file.getParentFile().exists()) {
  77. file.getParentFile().mkdirs();
  78. }
  79. file.createNewFile();
  80. }
  81. FileOutputStream os = new FileOutputStream(file);
  82. archive.extractFile(fileHeader, os);
  83. os.close();
  84. } catch (Exception ex) {
  85. throw ex;
  86. }
  87. }
  88. }
  89. archive.close();
  90. } catch (Exception e) {
  91. throw e;
  92. }
  93. }
  94. public static boolean existZH(String str) {
  95. String regEx = "[\\u4e00-\\u9fa5]";
  96. Pattern p = Pattern.compile(regEx);
  97. Matcher m = p.matcher(str);
  98. while (m.find()) {
  99. return true;
  100. }
  101. return false;
  102. }
  103. //使用main方法进行测试
  104. public static void main(String[] args) {
  105. try {
  106. String filepath = "E:\\test\\测试1.rar";
  107. String newpath="E:\\test\\zipTest";
  108. //获取最后一个.的位置
  109. int lastIndexOf = filepath.lastIndexOf(".");
  110. //获取文件的后缀名 .jpg
  111. String suffix = filepath.substring(lastIndexOf);
  112. System.out.println(suffix);
  113. if(suffix.equals(".zip")){
  114. unZipFiles(filepath,newpath);
  115. }else if(suffix.equals(".rar")){
  116. unRarFile(filepath,newpath);
  117. }
  118. } catch (Exception e) {
  119. e.printStackTrace();
  120. }
  121. }
  122. }

第二种:

  1. // 获取本地rar
  2. public void unRarByPath() {
  3. String rarPath = "D:\\文件.rar";
  4. try {
  5. File outFileDir = new File(rarPath);
  6. Archive archive = new Archive(new FileInputStream(rarFile));
  7. FileHeader fileHeader;
  8. while ((fileHeader = archive.nextFileHeader()) != null) {
  9. // 解决文件名中文乱码问题
  10. String fileName = fileHeader.getFileNameW().isEmpty() ? fileHeader.getFileNameString() :
  11. fileHeader.getFileNameW();
  12. String fileExt =
  13. fileName.substring(fileName.lastIndexOf(FileConstant.FILE_SEPARATOR) + 1);
  14. System.out.println(fileName);
  15. ByteArrayOutputStream os = new ByteArrayOutputStream();
  16. archive.extractFile(fileHeader, os);
  17. // 将文件信息写到byte数组中
  18. byte[] bytes = os.toByteArray();
  19. System.out.println(bytes.length);
  20. if ("rar".equals(fileExt)) {
  21. Archive secondArchive = new Archive(new ByteArrayInputStream(bytes));
  22. // 循环解压
  23. }
  24. }
  25. } catch (IOException e) {
  26. e.printStackTrace();
  27. }
  28. }

第三种:

  1. /**
  2. * 根据原始rar路径,解压到指定文件夹下
  3. * 这种方法只能解压rar 5.0版本以下的,5.0及其以上的无法解决
  4. *
  5. * @param srcRarPath 原始rar路径+name
  6. * @param dstDirectoryPath 解压到的文件夹
  7. */
  8. public static String unRarFile(String srcRarPath, String dstDirectoryPath) throws Exception {
  9. log.debug("unRarFile srcRarPath:{}, dstDirectoryPath:{}", srcRarPath, dstDirectoryPath);
  10. if (!srcRarPath.toLowerCase().endsWith(".rar")) {
  11. log.warn("srcFilePath is not rar file");
  12. return "";
  13. }
  14. File dstDiretory = new File(dstDirectoryPath);
  15. // 目标目录不存在时,创建该文件夹
  16. if (!dstDiretory.exists()) {
  17. dstDiretory.mkdirs();
  18. }
  19. // @Cleanup Archive archive = new Archive(new File(srcRarPath)); com.github.junrar 0.7版本jarAPI
  20. @Cleanup Archive archive = new Archive(new FileInputStream(new File(srcRarPath)));
  21. if (archive != null) {
  22. // 打印文件信息
  23. archive.getMainHeader().print();
  24. FileHeader fileHeader = archive.nextFileHeader();
  25. while (fileHeader != null) {
  26. // 解决中文乱码问题【压缩文件中文乱码】
  27. String fileName = fileHeader.getFileNameW().isEmpty() ? fileHeader.getFileNameString() : fileHeader.getFileNameW();
  28. // 文件夹
  29. if (fileHeader.isDirectory()) {
  30. File fol = new File(dstDirectoryPath + File.separator + fileName.trim());
  31. fol.mkdirs();
  32. } else { // 文件
  33. // 解决linux系统中\分隔符无法识别问题
  34. String[] fileParts = fileName.split("\\\\");
  35. StringBuilder filePath = new StringBuilder();
  36. for (String filePart : fileParts) {
  37. filePath.append(filePart).append(File.separator);
  38. }
  39. fileName = filePath.substring(0, filePath.length() - 1);
  40. File out = new File(dstDirectoryPath + File.separator + fileName.trim());
  41. if (!out.exists()) {
  42. // 相对路径可能多级,可能需要创建父目录.
  43. if (!out.getParentFile().exists()) {
  44. out.getParentFile().mkdirs();
  45. }
  46. out.createNewFile();
  47. }
  48. @Cleanup FileOutputStream os = new FileOutputStream(out);
  49. archive.extractFile(fileHeader, os);
  50. }
  51. fileHeader = archive.nextFileHeader();
  52. }
  53. } else {
  54. log.warn("rar file decompression failed , archive is null");
  55. }
  56. return dstDirectoryPath;
  57. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/388139
推荐阅读
相关标签
  

闽ICP备14008679号