此代码是递归打包一个目录,如需要将多个不同目录下的文件打包成一个压缩包,点我跳转
---------------------------------------------------------------------------------------------------------------------------
package space.core.common.utils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
/**
* 文件打包工具类
*
* @author SPACE
* @log Jun 14, 2020 9:23:19 PM
*/
public class ZipUtil {
static Logger log = LogManager.getLogger(ZipUtil.class);
/**
* 打包指定的目录
*
* @param sourcePath 待打包的文件目录
* @param createZipPath 存储压缩包的路径
* @throws Exception
* @author SPACE
* @log Jun 14, 2020 9:25:32 PM
*/
public static void packageZip(String sourcePath, String createZipPath) throws Exception {
FileOutputStream fos = null;
ZipOutputStream zos = null;
try {
fos = new FileOutputStream(createZipPath);
zos = new ZipOutputStream(fos);
File file = new File(sourcePath);
writeZos(file, "", zos);
}
catch (Exception e) {
throw e;
}
finally {
try {
if (zos != null) {
zos.close();
}
if (fos != null) {
fos.close();
}
}
catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 将文件添加到压缩包内
*
* @param file 待添加的文件
* @param parentPath 父目录路径
* @param zos 压缩流
* @throws Exception
* @author SPACE
* @log 2017-7-18 上午11:47:40 <br>
* Jun 15, 2020 1:18:39 AM By SPACE
*/
static void writeZos(File file, String parentPath, ZipOutputStream zos) throws Exception {
// 判断文件是否存在
if (!file.exists()) {
throw new FileNotFoundException("文件不存在, " + file.getPath());
}
// 如果是目录,那就递归查询该目录下的所有文件
if (file.isDirectory()) {
parentPath += ("/" + file.getName() + "/");
log.info("parentPath => " + parentPath);
File[] listFiles = file.listFiles(); // 文件列表
/* 如果不是空目录,那就递归文件夹 */
if (listFiles.length != 0) {
for (int i = 0; i < listFiles.length; i++) {
writeZos(listFiles[i], parentPath, zos);
}
}
/* 如果是空目录,那就为当前目录创建一个子目录 */
else {
zos.putNextEntry(new ZipEntry(parentPath));
}
}
/* 如果是文件,就把这个文件进行打包。
* 原理:先创建*.zip压缩包,然后发现一个文件就写进去一个,直到写完为止,
* ZipEntry 可以当成压缩包内的一个实体文件,只要 zos 流不关闭,就一直可以写不同路径下的文件到压缩包内。 */
else {
ZipEntry entry = new ZipEntry(parentPath + file.getName());
zos.putNextEntry(entry);
int length = 0;
byte[] fileByte = new byte[1024];
FileInputStream fis = new FileInputStream(file);
while( (length = fis.read(fileByte)) != -1 ) {
zos.write(fileByte,0,length);
zos.flush();
}
}
}
}
调用
public static void main(String[] args) {
packageZip("F:/OwO/testFiles/imgs/","C:/Users/space/Desktop/newFile/test.zip");
}