java实现对一个文件夹内所有文件包括子文件夹的压缩 (zip格式)
一、压缩效果展示
待压缩文件目录结构
准备压缩temp文件夹,temp含有2个子文件夹和1个文件,每个子文件夹里包含1个文件
PS:这里子文件夹和文件可以是多个,文件可以是任意类型的
压缩后文件目录结构
准备压缩到E:\Download目录下
PS:这里将之前的temp文件夹名称替换成了test20240202
二、实现代码
1.工具类
ZipFileUtil.java代码如下:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ZipFileUtil {
/**
*
* @param sourceFilePath 源文件夹路径 E:\Download\temp
* @param folderName 压缩后父级文件夹名称 test20240202
* @param targetFilePath 压缩文件路径 E:\Download\test20240202.zip
*/
public static void compressFile(String sourceFilePath,String folderName,String targetFilePath){
File targetFile = new File(targetFilePath);
if(!targetFile.getParentFile().exists()){
targetFile.getParentFile().mkdir();
}
File file = new File(sourceFilePath);
if(file.exists()){
try(FileOutputStream fos = new FileOutputStream(targetFilePath);
ZipOutputStream zos = new ZipOutputStream(fos);
){
addFilesToZip(file,folderName,zos);
}catch (IOException e){
e.printStackTrace();
}
}
}
/**
* 将文件夹进行打包,这个文件夹目录下既可以包含多个子目录文件夹,也可以包含多个文件,最后会原封不动的进行打包压缩
* @param file
* @param folderName
* @param zos
* @throws IOException
*/
public static void addFilesToZip(File file,String folderName,ZipOutputStream zos) throws IOException{
for(File child:file.listFiles()){
if(child.isDirectory()){
// 如果子文件是个文件夹,继续进行遍历
addFilesToZip(child,folderName+File.separator+child.getName(),zos);
}else{
// 进行压缩
byte[] buffer = new byte[1024];
int len;
try(FileInputStream fis = new FileInputStream(child)){
zos.putNextEntry(new ZipEntry(folderName+File.separator+child.getName()));
while((len = fis.read(buffer))!=-1){
zos.write(buffer,0,len);
}
zos.closeEntry();
}
}
}
}
}
2.测试类
ZipFileUtilMain.java代码如下:
import com.guoran.w.util.ZipFileUtil;
public class ZipFileUtilMain {
public static void main(String[] args) {
// 源文件夹路径
String sourceFilePath = "E:\\Download\\temp";
// 压缩后父级文件夹名称
String folderName = "test20240202";
// 压缩文件路径
String targetFilePath = "E:\\Download\\test20240202.zip";
ZipFileUtil.compressFile(sourceFilePath,folderName,targetFilePath);
}
}