Java实现文件压缩与解压缩-----.7z
Java中实现.7z的压缩与解压缩
Java中实现.zip的压缩与解压缩
其他参考连接
知识点讲解
知识点精讲
1. 压缩
本代码可以实现文件夹下多个文件的.7z压缩~
1.1 实现代码
import org.apache.commons.compress.archivers.sevenz.SevenZArchiveEntry;
import org.apache.commons.compress.archivers.sevenz.SevenZOutputFile;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
/**
* date: 2019/07/27
* writed by yangtingting
*/
public class File7z {
/**
* 7z文件压缩
*
* @param inputFile 待压缩文件夹/文件名
* @param outputFile 生成的压缩包名字
*/
public static void Compress7z(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();
}
}
public static void main (String[]args){
try {
Compress7z("D:\\YTT", "D:\\TestbyYTT.7z");
} catch (Exception e) {
e.printStackTrace();
}
}
}
1.2 maven依赖
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.9</version>
</dependency>
<dependency>
<groupId>org.tukaani</groupId>
<artifactId>xz</artifactId>
<version>1.5</version>
</dependency>
</dependencies>
2. .7z文件的解压
2.1 源代码
import org.apache.commons.compress.archivers.sevenz.SevenZArchiveEntry;
import org.apache.commons.compress.archivers.sevenz.SevenZFile;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class Uncompress7z {
public static void Uncompress(String inputFile, String destDirPath) throws Exception {
/**
* zip解压
* @param inputFile 待解压文件名
* @param destDirPath 解压路径
*/
File srcFile = new File(inputFile);//获取当前压缩文件
// 判断源文件是否存在
if (!srcFile.exists()) {
throw new Exception(srcFile.getPath() + "所指文件不存在");
}
//开始解压
SevenZFile zIn = new SevenZFile(srcFile);
SevenZArchiveEntry entry = null;
File file = null;
while ((entry = zIn.getNextEntry()) != null) {
if (!entry.isDirectory()) {
file = new File(destDirPath, entry.getName());
if (!file.exists()) {
new File(file.getParent()).mkdirs();//创建此文件的上级目录
}
OutputStream out = new FileOutputStream(file);
BufferedOutputStream bos = new BufferedOutputStream(out);
int len = -1;
byte[] buf = new byte[1024];
while ((len = zIn.read(buf)) != -1) {
bos.write(buf, 0, len);
}
// 关流顺序,先打开的后关闭
bos.close();
out.close();
}
}
}
public static void main (String[]args){
try {
Uncompress("D:\\TestbyYTT.7z", "D:\\YTTnew");
} catch (Exception e) {
e.printStackTrace();
}
}
}
2.2 警告问题解决
idea 警告:Warning:java: 源值1.5已过时, 将在未来所有发行版中删除
解决方法: 在pom.xml文件中添加下列代码
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
同时,还需要再maven配置文件settings.xml中加入下列代码。
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>