java 7z 压缩
时间: 2023-07-07 07:43:43 浏览: 54
要在 Java 中使用 7z 压缩,可以使用第三方库 SevenZipJBinding。以下是一个简单的示例代码:
```java
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.SystemUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.github.junrar.Archive;
import com.github.junrar.exception.RarException;
import com.github.junrar.impl.FileVolumeManager;
import com.github.junrar.rarfile.FileHeader;
import net.sf.sevenzipjbinding.ExtractOperationResult;
import net.sf.sevenzipjbinding.ISevenZipInArchive;
import net.sf.sevenzipjbinding.SevenZip;
import net.sf.sevenzipjbinding.SevenZipException;
import net.sf.sevenzipjbinding.impl.RandomAccessFileInStream;
public class SevenZipUtils {
private static final Logger LOGGER = LogManager.getLogger(SevenZipUtils.class);
/**
* 解压 7z 文件
*
* @param srcFile
* 压缩文件
* @param destDir
* 目标目录
* @throws IOException
* @throws SevenZipException
*/
public static void extract7z(File srcFile, File destDir) throws IOException, SevenZipException {
LOGGER.info("Extracting {} to {}", srcFile, destDir);
RandomAccessFileInStream inputStream = null;
ISevenZipInArchive inArchive = null;
try {
inputStream = new RandomAccessFileInStream(srcFile.getAbsolutePath(), "r");
inArchive = SevenZip.openInArchive(null, inputStream);
int numItems = inArchive.getNumberOfItems();
for (int i = 0; i < numItems; i++) {
ExtractOperationResult result = null;
String destFileName = null;
do {
if (result != null) {
LOGGER.warn("Extracting {} failed, trying again", destFileName);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
destFileName = inArchive.getProperty(i, ISevenZipInArchive.NM_FILE_NAME);
if (StringUtils.isBlank(destFileName)) {
LOGGER.warn("File name is blank, using default");
destFileName = FilenameUtils.getBaseName(srcFile.getName()) + "." + FilenameUtils.getExtension(srcFile.getName()) + "." + i;
}
destFileName = FilenameUtils.separatorsToSystem(destFileName);
File destFile = new File(destDir, destFileName);
if (destFile.exists()) {
FileUtils.forceDelete(destFile);
}
if (inArchive.getArchiveFormat() == net.sf.sevenzipjbinding.ArchiveFormat.RAR) {
FileVolumeManager fileVolumeManager = new FileVolumeManager(srcFile);
Archive archive = new Archive(fileVolumeManager);
FileHeader fileHeader = archive.getFileHeaders().stream().filter(fh -> destFileName.equals(fh.getFileNameString())).findFirst().get();
result = inArchive.extractSlow(i, fileHeader.getFileNameW(), destFile.getParent(), fileHeader.isEncrypted());
} else {
result = inArchive.extractSlow(i, destFile);
}
} while (result != ExtractOperationResult.OK);
}
} finally {
IOUtils.closeQuietly(inArchive);
IOUtils.closeQuietly(inputStream);
}
}
}
```
需要注意的是,SevenZipJBinding 依赖于 7-Zip 命令行工具,因此需要先安装 7-Zip 并将其添加到环境变量中。