JAVA压缩文件之-ZipOutputStream

package com.newio;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.*;


/*需求分析:本节需要java三个压缩技术之--ZipOutputStream
 * public ZipOutputStream(OutputStream out):创建新的zip输出流
 * */
class ZipTool{

    /**
     * 1.压缩一个文件:
     * @author ManagementAndJava
     * @param fileName:被压缩的文件名
     * @param zipFileName:压缩完成的文件名
     * @throws IOException
     * 
     */
    public static void compressFile(String fileName,String zipFileName) throws IOException{
        //1.建立要被压缩的文件对象;
        File file = new File(fileName);
        //2.建立输出的压缩文件对象
        File zipFile = new File(zipFileName);
        //3.对压缩文件输入流进行封装
        ZipOutputStream zos = new ZipOutputStream(new CheckedOutputStream(
                new FileOutputStream(zipFile),new Adler32()));
        BufferedOutputStream bos = new BufferedOutputStream(zos);
        //4.设置压缩文件中的每个条目
        zos.putNextEntry(new ZipEntry(file.getName()));
        //5.对被压缩的文件输出流进行封装
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
        //6.从输出流读出数据写入输入流中
        int len;
        byte[] bytes = new byte[1024];
        while((len = bis.read(bytes))!=-1){
            bos.write(bytes, 0, len);
            bos.flush();
        }
        //7.关闭条目和流
        zos.closeEntry();
        bis.close();
        zos.close();
    }

    /**
     * 2.压缩一个文件夹:
     * @author ManagementAndJava
     * @param fileName:被压缩的文件名
     * @param zipFileName:压缩完成的文件名
     * @throws IOException
     * 
     */
    public static void compressFiles(String fileName,String zipFileName) throws IOException{
        //1.建立被压缩文件对象
        File file = new File(fileName);
        //2.建立输出的压缩文件对象
        File zipFile = new File(zipFileName);
        //3.对压缩文件输入流进行封装
        ZipOutputStream zos = new ZipOutputStream(new CheckedOutputStream(
                    new FileOutputStream(zipFile),new Adler32()));
        BufferedOutputStream bos = new BufferedOutputStream(zos);

        if(file.isDirectory()){
            int len;
            byte[] bytes = new byte[1024];
            BufferedInputStream bis ;
            File[] files = file.listFiles();
            for(int i=0;i//4.对被压缩的文件输出流进行封装
                bis = new BufferedInputStream(new FileInputStream(files[i]));
                //5.建立压缩文件中的条目
                zos.putNextEntry(new ZipEntry(files[i].getName()));
                //6.从输出流读出数据写入输入流中
                while((len = bis.read(bytes))!=-1){
                    bos.write(bytes,0,len);
                    bos.flush();
                }
                bis.close();
            }
            zos.closeEntry();
        }
        bos.close();
    }

    /**
     * 3.压缩一个目录:其中可以含有多个文件和文件夹;
     * @author ManagementAndJava
     * @param fileName:被压缩的文件名
     * @param zipFileName:压缩完成的文件名
     * @throws IOException
     * 
     */
    public static void compressDir(String fileName,String zipFileName) throws IOException{
        //1.建立被压缩目录对象
        File inFile = new File(fileName);
        //2.建立输入的压缩文件对象
        File zipFile = new File(zipFileName);
        //3.对压缩问价输入流进行封装
        ZipOutputStream zos = new ZipOutputStream(
                new CheckedOutputStream(
                        new FileOutputStream(zipFile),new Adler32()));
        BufferedOutputStream bos = new BufferedOutputStream(zos);

        //定义一个方法内部来来拿到所有的文件名;
        class ListDir{
            private  ArrayList list = new ArrayList();
            //递归调用来遍历所有的文件名称;
            public  ArrayList listDir(File dir){
                if(dir.isDirectory()){
                    File[] files = dir.listFiles();
                    for(File f:files){
                        listDir(f);
                    }
                }
                else{
                    String dirName = dir.getAbsolutePath();     
                    list.add(dirName);
                }
                return list;        
            }
        }

        //4.拿到文件目录下的所有文件;
        ArrayList list = new ListDir().listDir(inFile);

        int len;
        BufferedInputStream bis;
        for(int i=0;inew BufferedInputStream(new FileInputStream(list.get(i)));
            zos.putNextEntry(new ZipEntry(list.get(i)));
            byte[] bytes = new byte[512];
            while((len=bis.read(bytes))!=-1){
                bos.write(bytes,0,len);
                bos.flush();
            }
            bis.close();
        }
        bos.close();
    }
}


public class ZipDemo {

    public static void main(String[] args) throws IOException {
        //调用方法1;压缩一个文件
        ZipTool.compressFile("f:\\javatest\\1.java", "f:\\file.zip");
        //调用方法2:压缩一个文件夹
        ZipTool.compressFiles("f:\\javatest\\text", "f:\\files.zip");
        //调用方法3:压缩一个目录里面有多个文件和文件夹
        ZipTool.compressDir("f:\\javatest", "f:\\files.zip");


        System.out.println("zip succeed");

    }

}

你可能感兴趣的:(JAVA-SE)