Java解压压缩包(zip/rar/7z)

news/2024/11/23 5:33:27/

一、概述

主要实现解压压缩包,拿到压缩包中每个文件。

二、思路

针对压缩包的操作,首先需要拿到压缩包文件的流,然后利用第三方工具将流实例化,调用next方法迭代,然后分别操作压缩包中的单个文件。

三、代码实现

1.zip实现

jdk支持对zip流的操作,相关依赖在java.util.zip下

// 获取本地zip包
public void unzipByPath() {try {String localPath = "D:\\文件.zip";File file = new File(localPath);ZipInputStream zin; // 创建ZipInputStream对象InputStream inputStream = new FileInputStream(file);zin = new ZipInputStream(inputStream, Charset.forName("GBK")); // 实例化对象,指明要解压的文件ZipEntry entry;while ((entry = zin.getNextEntry()) != null) {System.out.println(zipEntry.getName());BufferedInputStream bs = new BufferedInputStream(zin);// 将文件信息写到byte数组中byte[] bytes = new byte[(int) entry.getSize()];bs.read(bytes, 0, (int) entry.getSize());if ("zip".equals(entry.getName().substring(entry.getName().lastIndexOf(".") + 1))) {ZipInputStream secondZip = new ZipInputStream(new ByteArrayInputStream(bytes), Charset.forName("GBK"));// 循环解压}}zin.close();} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}
}
// 获取远程zip包
public void unzipByUrl() {String fileUrl = "https://localhost:80/group1/M00/6D/A3/wKjScWE7PxqAQfUnAAGcIyZy0ZU422.zip";try {URL url = new URL(fileUrl);HttpURLConnection conn = (HttpURLConnection) url.openConnection();int resultCode = conn.getResponseCode();if (200 == resultCode) {ZipInputStream zipInputStream = new ZipInputStream(conn.getInputStream(), Charset.forName("GBK"));ZipEntry zipEntry;while ((zipEntry = zipInputStream.getNextEntry()) != null) {System.out.println(zipEntry.getName());BufferedInputStream bs = new BufferedInputStream(zipInputStream);// 将文件信息写到byte数组中byte[] bytes = new byte[(int) zipEntry.getSize()];bs.read(bytes, 0, (int) zipEntry.getSize());if ("zip".equals(zipEntry.getName().substring(zipEntry.getName().lastIndexOf(".") + 1))) {ZipInputStream secondZip = new ZipInputStream(new ByteArrayInputStream(bytes), Charset.forName("GBK"));// 循环解压}}}} catch (IOException e) {e.printStackTrace();}
}

2.rar实现

1)依赖

<!-- 解压rar所需的依赖 -->
<dependency><groupId>com.github.junrar</groupId><artifactId>junrar</artifactId><version>4.0.0</version>
</dependency>

2)代码

// 获取本地rar
public void unRarByPath() {String rarPath = "D:\\文件.rar";try {File outFileDir = new File(rarPath);Archive archive = new Archive(new FileInputStream(rarFile));FileHeader fileHeader;while ((fileHeader = archive.nextFileHeader()) != null) {// 解决文件名中文乱码问题String fileName = fileHeader.getFileNameW().isEmpty() ? fileHeader.getFileNameString() :fileHeader.getFileNameW();String fileExt =fileName.substring(fileName.lastIndexOf(FileConstant.FILE_SEPARATOR) + 1);System.out.println(fileName);ByteArrayOutputStream os = new ByteArrayOutputStream();archive.extractFile(fileHeader, os);// 将文件信息写到byte数组中byte[] bytes = os.toByteArray();System.out.println(bytes.length);if ("rar".equals(fileExt)) {Archive secondArchive = new Archive(new ByteArrayInputStream(bytes));// 循环解压}}} catch (IOException e) {e.printStackTrace();}
}
// 获取远程rar
public void unRarByUrl() {String rarUrl = "https://localhost:80/group1/M00/6D/A3/wKjScWE7PxqAQfUnAAGcIyZy0ZU422.rar";try {URL url = new URL(rarUrl);HttpURLConnection conn = (HttpURLConnection)url.openConnection();int resultCode = conn.getResponseCode();if (200 == resultCode) {InputStream inputStream = conn.getInputStream();Archive archive = new Archive(inputStream);FileHeader fileHeader;while ((fileHeader = archive.nextFileHeader()) != null) {// 解决文件名中文乱码问题String fileName = fileHeader.getFileNameW().isEmpty() ? fileHeader.getFileNameString() :fileHeader.getFileNameW();String fileExt =fileName.substring(fileName.lastIndexOf(FileConstant.FILE_SEPARATOR) + 1);System.out.println(fileName);ByteArrayOutputStream os = new ByteArrayOutputStream();archive.extractFile(fileHeader, os);// 将文件信息写到byte数组中byte[] bytes = os.toByteArray();System.out.println(bytes.length);if ("rar".equals(fileExt)) {Archive secondArchive = new Archive(new ByteArrayInputStream(bytes));// 循环解压}}}} catch (IOException e) {e.printStackTrace();}
}

3)注意
rar5的加密算法未开源,目前不支持对rar5的解压,建议压缩时选择rar4
在这里插入图片描述

3.7z实现

由于7z的算法等原因,目前只有针对文件的解压,不能直接对流进行操作

<!--apache提供的压缩包依赖-->
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-compress</artifactId><version>1.9</version>
</dependency>
<!--不引入xz依赖会在new SevenZFile的时候报错java.lang.NoClassDefFoundError: org/tukaani/xz/FilterOptions-->
<dependency><groupId>org.tukaani</groupId><artifactId>xz</artifactId><version>1.5</version>
</dependency>
// 解析本地7z文件
public void un7zByPath() {File srcFile = new File("C:\\文件.7z");//获取当前压缩文件//开始解压try {SevenZFile zIn = new SevenZFile(srcFile);SevenZArchiveEntry entry = null;File newFile = null;while ((entry = zIn.getNextEntry()) != null) {if (!entry.isDirectory()) {newFile = new File("destDirPath", entry.getName());if (!newFile.exists()) {new File(newFile.getParent()).mkdirs();//创建此文件的上级目录}OutputStream out = new FileOutputStream(newFile);BufferedOutputStream bos = new BufferedOutputStream(out);int len = -1;// 将文件信息写到byte数组中byte[] buf = new byte[(int) entry.getSize()];while ((len = zIn.read(buf)) != -1) {bos.write(buf, 0, len);}System.out.println(entry.getName() + "=" + Arrays.toString(buf));// 关流顺序,先打开的后关闭bos.close();out.close();}}} catch (IOException e) {e.printStackTrace();}
}

实在不行可以考虑把远程文件写到磁盘再读成文件,不过这种方法不太靠谱,暂不考虑

四、总结

有关rar5不能解析,以及7z不能直接对流进行操作,后面找到解决方法再写


http://www.ppmy.cn/news/696746.html

相关文章

压缩文件RAR和ZIP的区别

RAR和ZIP是两种不同的压缩格式&#xff0c;它们使用是不同的压缩算法。ZIP是公开且免费的&#xff0c;很早就有了&#xff0c;可以用于任何用途。RAR是私有的&#xff0c;申请了专利&#xff0c;不公开算法细节&#xff0c;是近年才出来的算法&#xff0c;压缩率比ZIP低&#x…

java解压缩zip、rar

解压缩zip 使用hutool工具包中ZipUtil工具类 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.2</version> </dependency>// 参数是压缩包路径和编码 // GBK是为了解决中文解压缩…

压缩——实测rar压缩的各种选项对文件压缩的效果(包括固实压缩)

本文为压缩相关内容的部分内容&#xff0c;如有更新&#xff1a;https://alvincr.com/2021/01/compress-entropy/ 二&#xff1a;压缩选项 1 压缩方式 从存储—>最好&#xff0c;压缩速度依次减慢&#xff0c;但是压缩效果依次增强。 个人测试&#xff1a;为了真实感受一下…

flutter笔记:network_info_plus 模块

flutter实战之常用模块 network_info_plus模块及其应用 - 文章信息 - Author: Jack Lee (jcLee95) Visit me at: https://jclee95.blog.csdn.netEmail: 291148484163.com. Shenzhen ChineAddress of this article:https://blog.csdn.net/qq_28550263/article/details/13141787…

java对压缩文件7z、rar、zip的解压

需求&#xff0c;对Spring传递上来的文件进行解压&#xff0c;分析数据&#xff0c;这是解压模块 <!--apache提供的压缩包依赖--><dependency><groupId>org.apache.commons</groupId><artifactId>commons-compress</artifactId><versio…

华硕(苏研)面经

首先是一个线上测试&#xff0c;具体是一些c语言&#xff0c;逻辑推理以及算法等问题&#xff0c;当时没好好做&#xff0c;以为凉了&#xff0c;但是过了好久突然收到了面试通知。 收到面试通知后让你进行一个性格测试&#xff0c;并完成一个履历表。 然后进行一面&#xff…

C语言学习(三十)---枚举、位段、联合体

这几天在往实习的地方弄东西&#xff0c;比较累&#xff0c;因此没有更新&#xff0c;在几天前我们学习了内存操作函数&#xff0c;其与之前学习的字符串操作函数相比&#xff0c;适用范围更加广泛&#xff0c;大家要注意掌握学习&#xff0c;今天我们将学习枚举、位段和联合体…

互联网/计算机 校园招聘信息大全!

要想找到好工作&#xff0c;及时获得大厂的招聘信息肯定是第一步啦&#xff01; 微信公众号 “计算机校招”&#xff0c;每天都会更新最新的“互联网/计算机/科技类 公司” 校园招聘信息&#xff0c;欢迎关注&#xff01; 下面是2020年 春招 包含 计算机/软件技术类 的公司列表…