RAR文件格式由WinRAR开发,广泛用于文件压缩和归档。随着技术的发展,RAR5作为更新的版本,引入了多项改进以提高压缩效率和数据安全性。

  •   压缩效率:RAR5通过增大字典大小至32MB,相较于RAR4的4MB,能够更有效地找到数据中的重复模式,从而提高压缩率,特别是在处理大型文件时。
  •   安全性增强:RAR5采用的256位AES加密算法,提供了更高级别的数据保护,相较于RAR4的加密标准,更难被破解。
  •   时间戳的国际化:RAR5使用UTC时间,解决了RAR4使用本地时间可能导致的时区混淆问题,使得文件的时间戳在全球范围内保持一致性。
  •   兼容性考虑:RAR5的格式较新,可能不被旧版本的解压软件识别。在需要确保最大兼容性的场景下,可能仍需使用RAR4格式。
  •   恢复卷的改进:RAR5格式支持的恢复卷数量大大增加,从RAR4的255个增加到65535个,这在处理多卷压缩文件时提供了更高的灵活性和容错性。
  •   错误纠正能力:RAR5的恢复记录基于Reed-Solomon错误纠正码,显著提高了压缩文件在受损情况下的自我修复能力。
  •   日志文件编码:RAR5使用UTF-16小端字节序编码,确保了日志文件中Unicode字符的正确存储和显示,提高了对国际化文件名的支持。

RAR5的Java解压实现

在Java中实现RAR5文件的解压,可以借助java-unrarSevenZipJBinding库。以下是具体的实现步骤和代码示例。

1、添加依赖:在项目的pom.xml文件中添加相关依赖。

 <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>

2、编写解压工具类:创建Rar5DocExtractor类,实现解压逻辑。

  1 package rar5;
2
3 import net.sf.sevenzipjbinding.*;
4 import net.sf.sevenzipjbinding.impl.RandomAccessFileInStream;
5
6 import java.io.*;
7 import java.util.*;
8
9 public class Rar5DocExtractor {
10
11 public List<File> extractFiles(File rarFile, File outputDir) throws IOException {
12 Set<File> extractedFiles = new HashSet<>();
13 if (!outputDir.exists()) {
14 outputDir.mkdirs(); // 确保输出目录存在
15 }
16
17 RandomAccessFile randomAccessFile = null;
18 IInArchive inArchive = null;
19 try {
20 randomAccessFile = new RandomAccessFile(rarFile, "r");
21 inArchive = SevenZip.openInArchive(null, new RandomAccessFileInStream(randomAccessFile));
22 int[] in = new int[inArchive.getNumberOfItems()];
23 for (int i = 0; i < in.length; i++) {
24 in[i] = i;
25 }
26 inArchive.extract(in, false, new ExtractCallback(inArchive, outputDir.getAbsolutePath(), extractedFiles));
27 } finally {
28 if (randomAccessFile != null) {
29 randomAccessFile.close();
30 }
31 if (inArchive != null) {
32 try {
33 inArchive.close();
34 } catch (SevenZipException e) {
35 e.printStackTrace();
36 }
37 }
38 }
39 List<File> list=new ArrayList<>(extractedFiles);
40 return list;
41 }
42
43 private static class ExtractCallback implements IArchiveExtractCallback {
44 private IInArchive inArchive;
45 private String outDir;
46 private Set<File> extractedFiles;
47 // 用于跟踪是否需要关闭流的变量
48 private OutputStream fos = null;
49 private boolean closeStreamAfterOperation = false; // 标记流是否需要关闭
50
51 public ExtractCallback(IInArchive inArchive, String outDir, Set<File> extractedFiles) {
52 this.inArchive = inArchive;
53 this.outDir = outDir;
54 this.extractedFiles = extractedFiles;
55 }
56
57 @Override
58 public void setCompleted(long arg0) throws SevenZipException {
59 }
60
61 @Override
62 public void setTotal(long arg0) throws SevenZipException {
63 }
64
65
66 @Override
67 public ISequentialOutStream getStream(int index, ExtractAskMode extractAskMode) throws SevenZipException {
68 final String path = (String) inArchive.getProperty(index, PropID.PATH);
69 // 这里不再创建 File 对象,避免多次调用 getStream 时重复创建
70 return new ISequentialOutStream() {
71 public int write(byte[] data) throws SevenZipException {
72 File file = new File(outDir, path);
73 try {
74 if (data.length == 0) return 0;
75 file.getParentFile().mkdirs(); // 确保目录存在
76 if (fos == null) { // 如果这是第一次写入,初始化输出流
77 fos = new FileOutputStream(file);
78 closeStreamAfterOperation = true; // 设置标记,表示需要在操作结果后关闭流
79 }
80 fos.write(data);
81 fos.flush(); // 刷新以确保数据被写入磁盘
82 extractedFiles.add(file); // 添加到提取文件集合
83 } catch (IOException e) {
84 throw new SevenZipException("Error writing data to file: " + path, e);
85 }
86 return data.length;
87 }
88 };
89 }
90
91 @Override
92 public void prepareOperation(ExtractAskMode arg0) throws SevenZipException {
93 }
94
95 @Override
96 public void setOperationResult(ExtractOperationResult extractOperationResult) throws SevenZipException {
97 if (closeStreamAfterOperation && fos != null) {
98 try {
99 // 关闭输出流
100 fos.close();
101 } catch (IOException e) {
102 throw new SevenZipException("关闭文件输出流时报错", e);
103 } finally {
104 // 重置标记
105 closeStreamAfterOperation = false;
106 // 清除引用,以便垃圾回收
107 fos = null;
108 }
109 }
110 }
111
112 }
113 }

3、编写测试类:创建测试类以验证RAR5文件的解压功能。

 1 package rar5;
2
3 import java.io.File;
4 import java.io.IOException;
5 import java.util.List;
6
7 public class RAR5ExtractorTest {
8
9 public static void main(String[] args) {
10 File rarDirFile = new File("src/main/resources/rar5Test06.rarbak");
11 File outDirFile = new File("src/main/resources/temp/rar5Test06.rar");
12
13 Rar5DocExtractor extractor = new Rar5DocExtractor();
14 try {
15 List<File> extractedFiles = extractor.extractFiles(rarDirFile, outDirFile);
16 System.out.println("Extracted files:");
17 for (File file : extractedFiles) {
18 System.out.println(file.getAbsolutePath());
19 }
20 } catch (IOException e) {
21 e.printStackTrace();
22 }
23 }
24 }

Java解压rar5兼容rar4的更多相关文章

  1. 关于Java解压文件的一些坑及经验分享(MALFORMED异常)

    文章也已经同步到我的csdn博客: http://blog.csdn.net/u012881584/article/details/72615481 关于Java解压文件的一些坑及经验分享 就在本周, ...

  2. Java解压和压缩带密码的zip或rar文件(下载压缩文件中的选中文件、向压缩文件中新增、删除文件)

    JAVA 实现在线浏览管理zip和rar的工具类 (有密码及无密码的)以及下载压缩文件中的选中文件(向压缩文件中新增.删除文件) 这是之前的版本 JAVA 解压压缩包中指定文件或实现压缩文件的预览及下 ...

  3. JAVA解压.Z及.ZIP文件

    <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-compress --> <dependency ...

  4. 【java】 java 解压tar.gz读取内容

    package com.xwolf.stat.util; import com.alibaba.druid.util.StringUtils; import com.alibaba.fastjson. ...

  5. Java解压上传zip或rar文件,并解压遍历文件中的html的路径

    1.本文只提供了一个功能的代码 public String addFreeMarker() throws Exception { HttpSession session = request.getSe ...

  6. java 解压 zip 包并删除

    需求是这样的,  在服务器上有 运营上传的zip 包,内容是用户的照片,我需要做的是 获取这些照片上传,并保存到 数据库. 这里面的 上传照片,保存数据库都不难,主要问题是解压zip包,和删除zip ...

  7. Java 解压zip压缩包

    因为最近项目需要批量上传文件,而这里的批量就是将文件压缩在了一个zip包里,然后读取文件进行解析文件里的内容. 因此需要先对上传的zip包进行解压.以下直接提供代码供参考: 1.第一个方法是用于解压z ...

  8. java解压多层目录中多个压缩文件和处理压缩文件中有内层目录的情况

    代码: package com.xiaobai; import java.io.File; import java.io.FileOutputStream; import java.io.IOExce ...

  9. 利用java解压,并重命名

    由于工作需要,写了一个小工具,利用java来解压文件然后对文件进行重命名 主要针对三种格式,分别是zip,rar,7z,经过我的多次实践我发现网上的类库并不能解压最新的压缩格式 对于zip格式: ma ...

  10. 【转】JAVA解压.TAR.Z及.ZIP文件

     解压.ZIP文件 package app.qdupr.Method; import java.io.File; import java.io.FileOutputStream; import jav ...

随机推荐

  1. Advanced .Net Debugging 9:平台互用性

    一.介绍 这是我的<Advanced .Net Debugging>这个系列的第九篇文章.这篇文章的内容是原书的第二部分的[调试实战]的第七章[互用性].互用性包含两个方面,第一个方面就是 ...

  2. Wgpu图文详解(01)窗口与基本渲染

    写在前面 如果对Rust与Wgpu比较关注的同学可能在网络上搜到过@sotrh国外大佬编写的<Learn Wgpu>,以及国内大佬@jinleili的优秀翻译作品<学习 Wgpu&g ...

  3. 使用Wesky.Net.Opentools库,一行代码实现实体类类型转换为Json格式字符串

    安装1.0.10以及以上版本的 Wesky.Net.OpenTools 包   包内,该功能的核心代码如下: 自定义属性: 实体类JSON模式生成器:   使用方式:引用上面的1.0.10版本或以上的 ...

  4. vue Ref 动态组件 keeplive

    ref被用来给元素或子组件注册引用信息.引用信息将会注册在父组件的 $refs 对象上.如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素:如果用在子组件上,引用就指向组件实例 # 普通d ...

  5. 国产大模型参加高考,同写2024年高考作文,及格分(通义千问、Kimi、智谱清言、Gemini Advanced、Claude-3-Sonnet、GPT-4o)

    大家好,我是章北海 今天高考,上午的语文结束,市面上又要来一场大模型参考的文章了. 我也凑凑热闹,让通义千问.Kimi.智谱清言一起来写一下高考作文. 公平起见,不加任何其他prompt,直接把题目甩 ...

  6. FlashDuty Changelog 2023-09-07 | 新增深色模式与主题配置

    FlashDuty:一站式告警响应平台,前往此地址免费体验! FlashDuty 现在已经全面支持了深色模式,这为您提供了更柔和的光线和舒适的界面外观.并且,您可以根据自己的喜好和使用环境动态切换深色 ...

  7. leetcode | 107. 二叉树的层序遍历 II | javascript实现 | c++实现

    题目 给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 . (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 思路 题目的要求相当于是求层序遍历数组的转置,我们只需利用js的 ...

  8. css 让页面变灰色

    html { -webkit-filter: grayscale(1); }-webkit-filter(滤镜)有十种效果,分别是:     // grayscale 灰度     // sepia ...

  9. mysql数据库慢SQL优化

    mysql数据库慢SQL优化优化来源: 阿里云 云数据库RDS 慢sql 或者CAT监控系统中的Transaction SQL or URL根据平均时间反馈来排查,决定是否增加索引,或者调整业务逻辑代 ...

  10. Asp.net Core 经过nginx代理后获取不到真实ip和scheme的问题

    背景 我最近在一个Asp.net core Web 程序在经过nginx代理后 ,总是获取不到用户真实i和scheme(HttpContext.Request.Scheme),挠头: 我们一般从请求头 ...