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<files.length;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<String> list = new ArrayList<String>();
            //递归调用来遍历所有的文件名称;
            public  ArrayList<String> 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<String> list = new ListDir().listDir(inFile);

        int len;
        BufferedInputStream bis;
        for(int i=0;i<list.size();i++){
            bis = new 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");

    }

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值