Java解压.7z格式压缩包

本文介绍了一个用于解压7z格式文件的Java工具类Un7zUtils,该工具支持带密码的7z文件解压,并详细展示了其实现过程。此外,还提供了一个递归删除文件夹的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.annet.upload.core.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;

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() {
					public int write(byte[] data) throws SevenZipException {
						try {
							String str = item.getPath();
							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 data
						sizeArray[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(); // 删除文件夹
			}
		}
	}
}

Maven依赖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>

 

转载于:https://my.oschina.net/pipimao/blog/1585521

### Java 实现解压 7z 压缩包文件 为了使用Java实现解压7z压缩包的功能,可以借助`sevenzipjbinding`库。此库提供了对7-Zip功能的支持,允许程序化地处理各种类型的压缩文件而无需依赖外部工具。 #### 添加依赖项 首先,在项目的构建配置中加入SevenZipJBinding的Maven依赖: ```xml <dependency> <groupId>net.sf.sevenzipjbinding</groupId> <artifactId>sevenzipjbinding-all-platforms</artifactId> <version>16.02-2.01-SNAPSHOT</version> </dependency> ``` #### 示例代码:解压7z文件到指定目录 下面是一段完整的Java代码片段,展示了如何读取并提取给定路径下的`.7z`文件至目标位置。 ```java import net.sf.sevenzipjbinding.ExtractAskMode; import net.sf.sevenzipjbinding.IInArchive; import net.sf.sevenzipjbinding.SevenZip; import net.sf.sevenzipjbinding.impl.RandomAccessFileInStream; import java.io.File; import java.io.FileOutputStream; public class SevenZExtractor { public static void extract(String sourceFilePath, String destinationDirPath) throws Exception { try (RandomAccessFileInStream randomAccessFileInputStream = new RandomAccessFileInStream(new File(sourceFilePath))) { IInArchive inArchive = SevenZip.openInArchive(null, randomAccessFileInputStream); int numberOfItems = (int)inArchive.getNumberOfItems(); for(int i=0; i<numberOfItems ;i++){ var item=inArchive.getItem(i); if (!item.isFolder()) { // Skip folders. final long size=item.getSize(); byte[] buffer=new byte[(int)Math.min(size ,8*1024)]; FileOutputStream fos=null; try{ fos=new FileOutputStream(destinationDirPath+"/"+item.getPath()); while(true){ ExtractAskMode mode=inArchive.extractItem(item.getIndex(),buffer,0,buffer.length,fos::write); switch(mode){ case ASK_OVERWRITE: break; case CANT_DECIDE: throw new RuntimeException("Can't decide"); default://ASK_SKIP continue; } } }finally{ if(fos!=null){ fos.close(); } } } } inArchive.close(); } } } ``` 上述代码通过遍历存档内的每一项,并将其内容逐个写出到磁盘上的相应位置完成了解压过程[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值