Java SpringBoot 7z 压缩、解压

cmd 7z 文件压缩

7z压缩测试

添加依赖

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.12</version>
</dependency>
<dependency>
<groupId>org.tukaani</groupId>
<artifactId>xz</artifactId>
<version>1.5</version>
</dependency>

ZipFileUtil

package com.vipsoft.web.utils;

import org.apache.commons.compress.archivers.sevenz.SevenZArchiveEntry;
import org.apache.commons.compress.archivers.sevenz.SevenZFile;
import org.apache.commons.compress.archivers.sevenz.SevenZOutputFile; import java.io.*;
import java.util.HashMap;
import java.util.Map; public class ZipFileUtil {
/**
* 7z文件压缩
*
* @param inputFile 待压缩文件夹/文件名
* @param outputFile 生成的压缩包名字
*/ public static void zip7z(String inputFile, String outputFile) throws Exception {
File input = new File(inputFile);
if (!input.exists()) {
throw new Exception(input.getPath() + "待压缩文件不存在");
}
SevenZOutputFile out = new SevenZOutputFile(new File(outputFile));
compress(out, input, null);
out.close();
} /**
* @param name 压缩文件名,可以写为null保持默认
*/
//递归压缩
public static void compress(SevenZOutputFile out, File input, String name) throws IOException {
if (name == null) {
name = input.getName();
}
SevenZArchiveEntry entry = null;
//如果路径为目录(文件夹)
if (input.isDirectory()) {
//取出文件夹中的文件(或子文件夹)
File[] flist = input.listFiles(); if (flist.length == 0)//如果文件夹为空,则只需在目的地.7z文件中写入一个目录进入
{
entry = out.createArchiveEntry(input,name + "/");
out.putArchiveEntry(entry);
} else//如果文件夹不为空,则递归调用compress,文件夹中的每一个文件(或文件夹)进行压缩
{
for (int i = 0; i < flist.length; i++) {
compress(out, flist[i], name + "/" + flist[i].getName());
}
}
} else//如果不是目录(文件夹),即为文件,则先写入目录进入点,之后将文件写入7z文件中
{
FileInputStream fos = new FileInputStream(input);
BufferedInputStream bis = new BufferedInputStream(fos);
entry = out.createArchiveEntry(input, name);
out.putArchiveEntry(entry);
int len = -1;
//将源文件写入到7z文件中
byte[] buf = new byte[1024];
while ((len = bis.read(buf)) != -1) {
out.write(buf, 0, len);
}
bis.close();
fos.close();
out.closeArchiveEntry();
}
} /**
* 7z解压缩
* @param z7zFilePath 7z文件的全路径
* @return 压缩包中所有的文件
*/
public static Map<String, String> unZip7z(String z7zFilePath){ String un7zFilePath = ""; //压缩之后的绝对路径 SevenZFile zIn = null;
try {
File file = new File(z7zFilePath);
un7zFilePath = file.getAbsolutePath().substring(0, file.getAbsolutePath().lastIndexOf(".7z"));
zIn = new SevenZFile(file);
SevenZArchiveEntry entry = null;
File newFile = null;
while ((entry = zIn.getNextEntry()) != null){
//不是文件夹就进行解压
if(!entry.isDirectory()){
newFile = new File(un7zFilePath, entry.getName());
if(!newFile.exists()){
new File(newFile.getParent()).mkdirs(); //创建此文件的上层目录
}
OutputStream out = new FileOutputStream(newFile);
BufferedOutputStream bos = new BufferedOutputStream(out);
int len = -1;
byte[] buf = new byte[(int)entry.getSize()];
while ((len = zIn.read(buf)) != -1){
bos.write(buf, 0, len);
}
bos.flush();
bos.close();
out.close();
}
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if (zIn != null)
zIn.close();
} catch (IOException e) {
e.printStackTrace();
}
} Map<String, String> resultMap = getFileNameList(un7zFilePath, "");
return resultMap;
} /**
* 获取压缩包中的全部文件
* @param path 文件夹路径
* @childName 每一个文件的每一层的路径==D==区分层数
* @return 压缩包中所有的文件
*/
private static Map<String, String> getFileNameList(String path, String childName) {
System.out.println("path:" + path + "---childName:"+childName);
Map<String, String> files = new HashMap<>();
File file = new File(path); // 需要获取的文件的路径
String[] fileNameLists = file.list(); // 存储文件名的String数组
File[] filePathLists = file.listFiles(); // 存储文件路径的String数组
for (int i = 0; i < filePathLists.length; i++) {
if (filePathLists[i].isFile()) {
files.put(fileNameLists[i] + "==D==" + childName, path + File.separator + filePathLists[i].getName());
} else {
files.putAll(getFileNameList(path + File.separator + filePathLists[i].getName(), childName + "&" + filePathLists[i].getName()));
}
}
return files;
}
}

Test

package com.vipsoft.web;

import com.vipsoft.web.utils.ZipFileUtil;
import org.junit.jupiter.api.Test; public class ZipTest { @Test
void zip7zTest() throws Exception {
String inputPath = "D:\\temp\\logs\\logs";
String outputPath = "D:\\temp\\logs\\1.7z";
ZipFileUtil.zip7z(inputPath, outputPath);
} @Test
void unZip7zTest() throws Exception {
String outputPath = "D:\\temp\\logs\\1.7z";
ZipFileUtil.unZip7z(outputPath);
}
}

Java SpringBoot 7z 压缩、解压的更多相关文章

  1. java 字符串zlib压缩/解压

    今天在测公司的中间件时发现,增加netty自带的zlib codec压缩处理后,就报decompress failed, invalid head之类的异常.后来发现,直接用bytebuf处理报文体是 ...

  2. 7z 压缩解压简单示例

    7z命令行压缩示例: 7z -tZip a test.zip ./test/* -mx0 把test文件夹中所有文件以存储压缩的模式压缩成zip格式的文件,压缩文件为test.zip a为添加选项   ...

  3. 使用SevenZipSharp压缩/解压7z格式

    7z格式采用的LZMA算法,号称具有现今最高压缩率.笔者在nuget上搜索7z,在搜索结果中最终选择了SevenZipSharp来进行压缩/解压.不得不说,SevenZipSharp的API设计得非常 ...

  4. Java压缩/解压.zip、.tar.gz、.tar.bz2(支持中文)

    本文介绍Java压缩/解压.zip..tar.gz..tar.bz2的方式. 对于zip文件:使用java.util.zip.ZipEntry 和 java.util.zip.ZipFile,通过设置 ...

  5. C#中使用7Z进行压缩解压

    SevenZipSharp相关文档下载地址: http://sevenzipsharp.codeplex.com/releases/view/51254 1. 解决方案中添加引用:SevenZipSh ...

  6. linux中tar及压缩解压命令用法

    把常用的tar解压命令总结下,当作备忘: tar 命令可以为Linux的文件和目录创建档案.利用 tar,可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向 档案中加入新的文件.t ...

  7. 使用C#压缩解压rar和zip格式文件

    为了便于文件在网络中的传输和保存,通常将文件进行压缩操作,常用的压缩格式有rar.zip和7z,本文将介绍在C#中如何对这几种类型的文件进行压缩和解压,并提供一些在C#中解压缩文件的开源库. 在C#. ...

  8. tar 压缩解压命令详解

    tar -c: 建立压缩档案-x:解压-t:查看内容-r:向压缩归档文件末尾追加文件-u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个.下面的 ...

  9. C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志

    C#实现多级子目录Zip压缩解压实例 参考 https://blog.csdn.net/lki_suidongdong/article/details/20942977 重点: 实现多级子目录的压缩, ...

  10. 解决Linux与Windows压缩解压中文文件名乱码(转载)

    转自:http://crazyfeng.com/linux-windows-compress-chinese-filename.html 由于Linux与Windows编码问题,使用Zip Tar 压 ...

随机推荐

  1. nodejs批量重命名

    const fs = require("fs"); // directory path let config = {   affix: null,   src: null, }; ...

  2. numpy基本使用(一)

    一.简介  NumPy(Numerical Python) 是用于科学计算及数据处理的Python扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库. 二.数据结构  n ...

  3. 【随笔】Java处理异常输出对象Exception,转为String输出

    声明:这段代码也是从网上摘抄的,当时忘记记录地址了,此为转载,勿怪 public static String handleException(Exception e) { StringBuffer m ...

  4. easycode模版-基于ruoyi-cloud

    ##定义初始变量 #set($tableName = $tool.append($tableInfo.name, "Controller")) ##设置回调 $!callback. ...

  5. 6 Sampling Configuration Space: 6.4 Adaptive Steered Molecular Dynamics

    6.4 Adaptive Steered Molecular Dynamics 理论背景: SMD 利用施加steering力的伪粒子,以便以特定速度穿过反应坐标. 这个外力允许人们在MD模拟时间尺度 ...

  6. P2671 [NOIP2015 普及组] 求和

    [NOIP2015 普及组] 求和 题目背景 NOIP2015 普及组 T3 题目描述 一条狭长的纸带被均匀划分出了\(n\)个格子,格子编号从\(1\)到\(n\).每个格子上都染了一种颜色\(co ...

  7. VulnHub靶场练习之 grotesque:2

    步骤1:信息收集 拿到靶机首先看一下开放的端口 可以看到开放了很多端口 比如22 ssh.80 http等等 那么就先访问一下80看一下 页面没有什么有用的东西 查看一下网页源代码 也没有找到什么有价 ...

  8. Hugging Face 每周速递: Chatbot Hackathon;FLAN-T5 XL 微调;构建更安全的 LLM

    每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...

  9. oracle学习笔记1 安装 虚拟机 plsql 连接 oracle

    第一步就是安装 为了节省资源,运行起来更快捷,首先是在电脑上安装好vm虚拟机, 新建虚拟机,安装xp,也就是把xp光盘文件导入, 接着在虚拟机中下载oracle,解压的话会用到WinRAR,也一并导入 ...

  10. 联邦学习开源框架FATE架构

    作者:京东科技 葛星宇 1.前言 本文除特殊说明外,所指的都是fate 1.9版本. fate资料存在着多处版本功能与发布的文档不匹配的情况,各个模块都有独立的文档,功能又有关联,坑比较多,首先要理清 ...