`import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ZipDir {
public static void main(String[] args) {
try {
File dir = new File("D:/apache-tomcat-9.0.41");
FileOutputStream fileOutputStream = new FileOutputStream(new File("d:/"+dir.getName()+".zip"));
ZipOutputStream zipOutputStream = new ZipOutputStream(fileOutputStream);
zipDir(dir,dir,zipOutputStream);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
System.out.println("压缩失败");
}
}
/**
*
* @param dir 代表当遍历的目录,有可能代表目录下的子目录
* @param sourceDir 代表被压缩的目录,在递归过程值不变,目的是为了生成压缩流的中名称(以sourceDir做参考)
* @param zipOutputStream
*/
public static void zipDir(File dir,File sourceDir,ZipOutputStream zipOutputStream) throws IOException {
if (dir.isDirectory()){
File[] files = dir.listFiles();//得到目录下文件
if (files!=null){
for(File f:files){//遍历目录下的文件
if (f.isDirectory()){//如果是目录,就递归
zipDir(f,sourceDir, zipOutputStream);//递归
}else{//文件,压缩 ZipOutputStream 代表一个压缩流,此方法会不断的递归调用,每调用一次new一个ZipOutputStream肯定会出错
//解决方案:通过方法的形参传递进来,或者是定义为成员变量
String entryName =sourceDir.getName()+ f.getAbsolutePath().substring(sourceDir.getAbsolutePath().length());
ZipEntry zipEntry = new ZipEntry(entryName);
//压缩某个文件失败时,应该整个压缩都是失败的,因此需要把异常抛出去。
//打开抽屉
zipOutputStream.putNextEntry(zipEntry);
//往抽屉中放东西(文件内容) 读文件内容,往压缩流中写
FileUtils.copyFile(f,zipOutputStream);//把当前文件往输出流(zipOutputStream)中写
//关闭抽屉
zipOutputStream.closeEntry();
}
}
}
}
}
}`