压缩文件夹
- maven依赖
- 主方法
- 压缩文件
- 递归删除文件夹中的目录及文件
maven依赖
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant</artifactId>
<version>1.9.7</version>
</dependency>
主方法
public static void createZip(String dir, String zip) {
//创建zip文件
OutputStream outputStream = null;
ZipOutputStream zos = null;
//需要压缩的文件或文件夹对象
File fileDir = new File(dir);
//生成的压缩文件
File fileZip = new File(zip);
try {
if (fileZip.exists()) {
return;
}
outputStream = new FileOutputStream(fileZip);
//创建zip文件的输出流
zos = new ZipOutputStream(outputStream);
//编码格式
zos.setEncoding("UTF-8");
//压缩文件的具体实现函数
zipFile(fileDir, zos, fileDir.getName());
} catch (Exception e) {
logger.error("文件压缩失败");
logger.error(e.getMessage());
} finally {
try {
zos.close();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
logger.info("压缩完成");
try {
//删除原文件夹
deleteFile(fileDir);
} catch (Exception e) {
e.printStackTrace();
logger.error("源文件夹无法删除");
}
}
压缩文件
/**
* 压缩文件执行方法
* @param file
* @param zos
* @param name
* @throws Exception
*/
private static void zipFile(File file, ZipOutputStream zos, String name) throws Exception {
byte[] buf = new byte[10240];
if (file.isFile()) {
// 向zip输出流中添加一个zip实体,构造器中name为zip实体的文件的名字
zos.putNextEntry(new ZipEntry(name));
// copy文件到zip输出流中
int len;
FileInputStream in = new FileInputStream(file);
while ((len = in.read(buf)) != -1) {
zos.write(buf, 0, len);
}
// Complete the entry
zos.closeEntry();
in.close();
} else {
//是文件夹
File[] listFiles = file.listFiles();
if (listFiles == null || listFiles.length == 0) {
// 需要保留原来的文件结构时,需要对空文件夹进行处理
// 空文件夹的处理
zos.putNextEntry(new ZipEntry(name + "/"));
// 没有文件,不需要文件的copy
zos.closeEntry();
} else {
for (File file1 : listFiles) {
// 注意:file.getName()前面需要带上父文件夹的名字加一斜杠,
// 不然最后压缩包中就不能保留原来的文件结构,即:所有文件都跑到压缩包根目录下了
zipFile(file1, zos, name + "/" + file1.getName());
}
}
}
}
递归删除文件夹中的目录及文件
/**
* 递归删除文件夹中的目录及文件
*
* @param sourceFile
* @throws Exception
*/
private static void deleteFile(File sourceFile) throws Exception {
//如果路径为目录
if (sourceFile.isDirectory()) {
//取出文件夹中的文件或子文件夹
File[] fList = sourceFile.listFiles();
if (fList.length == 0) {
sourceFile.delete();
} else {
for (int i = 0; i < fList.length; i++) {
deleteFile(fList[i]);
}
sourceFile.delete();
}
//如果为文件则直接删除
} else {
sourceFile.delete();
}
}