引言

最近在 项目中需要解压带有密码的.7z文件,然后获得里面的数据,之前都是zip 文件没有接触过解压7z类型的 文件,在这分享一下解压工具类,该 工具类可以同时解压带有密码的7z文件和zip文件。

1、pom文件中加入解压需要的三个jar

<dependency><groupId>net.sf.sevenzipjbinding</groupId><artifactId>sevenzipjbinding</artifactId><version>9.20-2.00beta</version></dependency><dependency><groupId>net.sf.sevenzipjbinding</groupId><artifactId>sevenzipjbinding-all-platforms</artifactId><version>9.20-2.00beta</version></dependency><dependency><artifactId>commons-io</artifactId><groupId>commons-io</groupId><version>2.0.1</version></dependency>

2、 工具类代码

package com.example.demo.utils;import java.io.File;
import java.io.FileOutputStream;
import java.io.RandomAccessFile;
import java.util.Arrays;import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import net.sf.sevenzipjbinding.ExtractOperationResult;
import net.sf.sevenzipjbinding.IInArchive;
import net.sf.sevenzipjbinding.ISequentialOutStream;
import net.sf.sevenzipjbinding.SevenZip;
import net.sf.sevenzipjbinding.SevenZipException;
import net.sf.sevenzipjbinding.impl.RandomAccessFileInStream;
import net.sf.sevenzipjbinding.simple.ISimpleInArchive;
import net.sf.sevenzipjbinding.simple.ISimpleInArchiveItem;
import org.springframework.stereotype.Service;@Service
public class Un7zUtils {private static Logger logger = LoggerFactory.getLogger(Un7zUtils.class);/*** * @Description (解压7z)* @param file7zPath(7z文件路径)* @param outPutPath(解压路径)* @param passWord(文件密码.没有可随便写,或空)* @return* @throws Exception*/public static int un7z(String file7zPath, final String outPutPath, String passWord) throws Exception {IInArchive archive;RandomAccessFile randomAccessFile;randomAccessFile = new RandomAccessFile(file7zPath, "r");archive = SevenZip.openInArchive(null, new RandomAccessFileInStream(randomAccessFile), passWord);int numberOfItems = archive.getNumberOfItems();ISimpleInArchive simpleInArchive = archive.getSimpleInterface();for (final ISimpleInArchiveItem item : simpleInArchive.getArchiveItems()) {final int[] hash = new int[] { 0 };if (!item.isFolder()) {ExtractOperationResult result;final long[] sizeArray = new long[1];result = item.extractSlow(new ISequentialOutStream() {@Overridepublic int write(byte[] data) throws SevenZipException {try {//String str = item.getPath();//System.out.println(File.separator);//str = str.substring(0, str.lastIndexOf(File.separator));//File file = new File(outPutPath + File.separator + str + File.separator);//if (!file.exists()) {//    file.mkdirs();//}File file1 = new File(outPutPath + File.separator + item.getPath());IOUtils.write(data, new FileOutputStream(file1, true));} catch (Exception e) {e.printStackTrace();}hash[0] ^= Arrays.hashCode(data); // Consume datasizeArray[0] += data.length;return data.length; // Return amount of consumed}}, passWord);if (result == ExtractOperationResult.OK) {logger.error("解压成功...." + String.format("%9X | %10s | %s", hash[0], sizeArray[0], item.getPath()));} else {logger.error("解压失败:密码错误或者其他错误...." + result);}}}archive.close();randomAccessFile.close();return numberOfItems;}/*** 递归删除文件夹* * @param file*/public static void deleteFile(File file) {if (file.exists()) { // 判断文件是否存在if (file.isFile()) { // 判断是否是文件file.delete(); // 删除文件} else if (file.isDirectory()) { // 否则如果它是一个目录File[] files = file.listFiles(); // 声明目录下所有的文件 files[];for (int i = 0; i < files.length; i++) { // 遍历目录下所有的文件deleteFile(files[i]); // 把每个文件用这个方法进行迭代}file.delete(); // 删除文件夹}}}
}

3、测试代码

@Testpublic void un7zip(){try {un7zUtils.un7z("D:\\7zip\\0320ZC1605查询.zip","D:\\7zip","20190320");}catch (Exception e){}}

我在本地 经过测试没有问题,并且我部署到测试服务器也可以正常解压,但是当代码部署到线上 以后遇到问题了,这就很尴尬了,主要怀疑是线上服务器的配置有问题,先看一下错误


java.lang.RuntimeException: SevenZipJBinding couldn't be initialized automaticly using initialization from platform depended JAR and the default temporary directory. Please, make sure the correct 'sevenzipjbinding-<Platform>.jar' file is on the class path or consider initializing SevenZipJBinding manualy using one of the offered initialization methods: 'net.sf.sevenzipjbinding.SevenZip.init*()'Caused by: net.sf.sevenzipjbinding.SevenZipNativeInitializationException: 7-Zip-JBinding initialization failed: Error loading native library: '/var/daihou/datapro/apache-tomcat-8.0.36/temp/SevenZipJBinding-OmKitFPSgs4S/lib7-Zip-JBinding.so'at net.sf.sevenzipjbinding.SevenZip.loadNativeLibraries(SevenZip.java:651)at net.sf.sevenzipjbinding.SevenZip.initSevenZipFromPlatformJARIntern(SevenZip.java:455)at net.sf.sevenzipjbinding.SevenZip.initSevenZipFromPlatformJAR(SevenZip.java:339)at net.sf.sevenzipjbinding.SevenZip.ensureLibraryIsInitialized(SevenZip.java:805)... 14 more
Caused by: java.lang.UnsatisfiedLinkError: /var/daihou/datapro/apache-tomcat-8.0.36/temp/SevenZipJBinding-OmKitFPSgs4S/lib7-Zip-JBinding.so: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by /var/daihou/datapro/apache-tomcat-8.0.36/temp/SevenZipJBinding-OmKitFPSgs4S/lib7-Zip-JBinding.so)at java.lang.ClassLo

从错误信息可以看,该服务器缺少libstdc++.so.6: version `GLIBCXX_3.4.15',我们可以通过下面命令查看一下服务器上是否安装

strings /usr/lib/libstdc++.so.6 | grep GLIBCXX

如果没有这个库,安装一下即可!

java解压加密的7z格式文件相关推荐

  1. centos解压分卷rar_centos解压和压缩rar格式文件

    在liunx下原本是不支持rar文件的,需要安装liunx下的winrar版本,操作如下 wget http://www.rarsoft.com/rar/rarlinux-4.0.1.tar.gz t ...

  2. java解压zip_Java实现zip压缩文件的解压

    需求描述: 前段时间写了一篇博客<Java实现对文本文件MD5加密并ftp传送到远程主机目录>,实现了一部分的业务需求.然而有些业务可能不止传送一个文件,有时候客户需要传多个文件,原有系统 ...

  3. java解压zip包_Java中文件的压缩与解压,每天进步一点点系列

    使用java.util.zip包,实现文件的压缩与解压,并提供了下载方法 注意 无论是调用createNewFile()创建文件,还是在创建输出流时由输出流负责创建文件,都必须保证父路径已经存在,否则 ...

  4. centos解压与压缩zip格式文件

    为方面日后使用,记录下压缩与解压zip文件 首先安装支持ZIP的工具 yum install -y unzip zip 解压zip文件 # 进入到对应文件目录下执行如下命令 unzip 文件名.zip ...

  5. java解压加密压缩包

    https://blog.csdn.net/qq_38723394/article/details/80853154

  6. Mac下7z格式文件解压

    Mac下7z格式文件解压 brew直接安装解压工具 $ brew search 7z p7zip $ brew install p7zip ==> Downloading https://dow ...

  7. Java解压文件Zip,War,Tar,TarGz格式

    Java压缩和解压缩 压缩和解压缩依赖 关于Java解压Zip文件的java.lang.IllegalArgumentException:MALFORMED报错问题. 解压缩代码 Zip解压缩 War ...

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

    关于Java解压文件的一些坑及经验分享 就在本周, 测试人员找到我说现上的需求文档(zip格式的)无法预览了, 让我帮忙看看怎么回事. 这个功能也并不是我做的, 于是我便先看看线上日志有没有什么错误, ...

  9. java解压/读取rar文件

    转自在此感谢作者:https://blog.csdn.net/lbf5210/article/details/51206642 <!-- 解压rar --> <dependency& ...

最新文章

  1. win7 桌面图标拖不动解决方法
  2. ECMAScript6 规范
  3. T-SQL查询进阶--变量
  4. 用汇编的眼光看C++(之虚函数)
  5. numpy 在机器学习中 常用函数总结
  6. python,web框架说明
  7. 【题解】Luogu P5294 [HNOI2019]序列
  8. 小米平板2刷Linux教程,小米平板2刷机教程 官方线刷图文教程
  9. 【记录】数控程序的指令代码---标准G代码与标准M代码
  10. Office 检测到一个与此文件相关的问题为帮助保护您的计算机,无法打开此文件。
  11. vue 组件开发基本思路
  12. VMware Fusion Player 个人免费版
  13. 购买服务器不显示d盘,购买云服务器后d盘
  14. 360公司2016校园招聘笔试题大题一
  15. Python3,我把新年祝福写在“雨“中,你看,雨一直下,气氛还算融洽,在同个屋檐下....
  16. Ubuntu16.04中鼠标左右键功能相反
  17. 电商也要懂的实体渠道实战知识zz
  18. 传导骚扰的一些其他总结
  19. 给电脑换上鸿蒙字体吧~
  20. WinRAR官方不带弹窗广告的简体中文版

热门文章

  1. Java数组知识点概述
  2. Android 内部存储和外部存储
  3. 【微信小程序】-- 自定义组件 - 数据监听器 (三十四)
  4. docker | 基于 WSL2 在 Windows 下使用 docker
  5. 在windows系统使用Gazebo9的小问题
  6. 半导体器件物理【1】量子理论扫盲——从Planck到态叠加原理
  7. 基于Ubuntu14.04搭建caffe训练环境
  8. java语言实现视频音频采集_详解js的视频和音频采集
  9. Monitor模式和AP模式下获取WiFi的CSI信号
  10. 年末了,是该总结一波了,冲鸭2021