java实现文件及目录压缩

package org.alfresco.repo.bom.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;




/**
 * Compressor Util
 * @author HJ
 *
 */
public class CompressorUtil {
    
    private static final String source = "F:/test"; // wait compressor source path 
    private static final String zipSource = "F:/chiang.zip"; // after compressor zip file path
    private static long startTime;// compressor start system time
    private static long endTime;// compressor end system time
    
    public void compressor() throws Exception{
        startTime = System.currentTimeMillis();//record start compressor system time , 
        boolean flag = false;// flag :true->compressor success
        String baseDir = "";//defalut relative Dir , "" is gen Dir
        
        File s = new File(source);
        File zs = new File(zipSource);//create zip file
        if (zs.exists()) {// if this dir exists this zip file 
            zs.delete(); // delete this zip file ,
        }
        ZipOutputStream zos = null;
        try {
            zos = new ZipOutputStream(new FileOutputStream(zs));
            zos.setEncoding("GBK"); // solve Chinese garbled
            startCompressor(baseDir, zos, s);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            if (zos!=null)
                zos.close();
            endTime = System.currentTimeMillis();
            System.out.println("compressor success,use time:"+(endTime-startTime)+"ms");
        }
    }
    
    public void startCompressor(String baseDir,ZipOutputStream zos,File source) throws Exception{
        if (source.isFile()) {// is file
            toCompressedFile(baseDir, zos, source);
        }
        if (source.isDirectory()) { //is dir
            File[] sources = source.listFiles(); // get dir all files ( file or dir)
            for(File f:sources){
                if (f.isFile()) {// is file
                    toCompressedFile(baseDir, zos, f);
                }
                if (f.isDirectory()) {//is dir
                    // if is dir , update baseDir value .
                    String newBaseDir = baseDir + f.getName() + "/";
                    createCompressedDir(baseDir, zos, f);//create dir and entry
                    startCompressor(newBaseDir, zos, f); //  Re
                }
            }
        }
    }
    /**
     * add entry to zip file by stream way 
     * @param baseDir
     * @param zos
     * @param f
     * @throws Exception
     */
    public void toCompressedFile(String baseDir,ZipOutputStream zos,File f) throws Exception{
        InputStream input = null;
        ZipEntry z = new ZipEntry(baseDir+f.getName());
        try {
            zos.putNextEntry(z); // add entry to zip file
            input = new FileInputStream(f); 
            int data = 0;
            while ((data=input.read())!=-1) {
                zos.write(data);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            if(input!=null)
                input.close();
            zos.closeEntry();
        }
    }
    
    /**
     * create compressed file dir and ZipEntry
     * @param baseDir 
     * @param zos    zip file's ZipOutputStream
     * @param f        
     */
    public void createCompressedDir(String baseDir,ZipOutputStream zos,File f){
        ZipEntry z = new ZipEntry(baseDir+f.getName()+"/");
        try {
            zos.putNextEntry(z);
            zos.closeEntry();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
    //test main method
    public static void main(String[] args) throws Exception{
        CompressorUtil cu = new CompressorUtil();
        cu.compressor();
    }
}
 

 

转载于:https://www.cnblogs.com/chiangfai/p/5828191.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值