用压缩流来压缩一个目录

`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();
               }
           }
       }
    }
}

}`

上一篇:I/O


下一篇:Java基础面试题——IO流