java antZip 解压缩 支持中文

package com.unionread.dqd.util;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;
/**
*功能:zip压缩、解压(支持中文文件名)
*
*仅供编程学习参考.
*/

public class AntZip{
    private static int      bufSize;    //size of bytes
    private byte[]          buf;
    private int             readedBytes;
    
    public AntZip(){
        this(512);
    }

    public AntZip(int bufSize){
        this.bufSize = bufSize;
        this.buf = new byte[this.bufSize];
    }
    
    //压缩文件夹内的文件
    public void doZip(String zipDirectory,String outFile){//zipDirectoryPath:需要压缩的文件夹名
        File zipDir = new File(zipDirectory);
        try{
            ZipOutputStream zipOut = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(outFile)));
            zipOut.setEncoding("GBK");
            handleDir(zipDir ,"", zipOut);
            zipOut.close();
        }catch(IOException ioe){
            ioe.printStackTrace();
        }
    }

    //由doZip调用,递归完成目录文件读取
    private void handleDir(File dir , String base, ZipOutputStream zipOut)throws IOException{
        FileInputStream fileIn;
        File[] files;
        
        if(dir.isDirectory()){    
             System.out.println(dir.getName());
             files = dir.listFiles();
             if(files.length == 0){//如果目录为空,则单独创建之.
                 //ZipEntry的isDirectory()方法中,目录以"/"结尾.      
                 zipOut.putNextEntry(new ZipEntry(base + File.separator));
                 zipOut.closeEntry();
             }else{//如果目录不为空,则分别处理目录和文件.
                  base = base.length() == 0 ? "" : base + File.separator;
                 for(File fileName : files){
                        handleDir(fileName , base+fileName.getName() ,zipOut);
                 }
             }          
        }else{       
             fileIn = new FileInputStream(dir);
             zipOut.putNextEntry(new ZipEntry(base));
             while((this.readedBytes = fileIn.read(this.buf))>0){
                 zipOut.write(this.buf , 0 , this.readedBytes);
             }
             fileIn.close();
             zipOut.closeEntry();    
        }
    }

    //解压指定zip文件
    @SuppressWarnings("unchecked")
    public void unZip(String unZipfileName,String outDir){//unZipfileName需要解压的zip文件名
        FileOutputStream fileOut;
        File file;
        InputStream inputStream;

        try{
            ZipFile zipFile  = new ZipFile(unZipfileName, "GBK");
            for(Enumeration<ZipEntry> entries = zipFile.getEntries(); entries.hasMoreElements();){
                ZipEntry entry = (ZipEntry)entries.nextElement();

                if(entry.isDirectory()){             
                    file = new File(outDir+File.separator+entry.getName());
                    file.mkdirs();
                }else{
                    file = new File(outDir+File.separator+entry.getName());
                    
                    File parent = file.getParentFile();
                    
                    if(!parent.exists())parent.mkdirs();

                    inputStream = zipFile.getInputStream(entry);

                    fileOut = new FileOutputStream(file);
                    while(( this.readedBytes = inputStream.read(this.buf) ) > 0){
                        fileOut.write(this.buf , 0 , this.readedBytes );
                    }
                    fileOut.close();

                    inputStream.close();
                }    
            }
            zipFile.close();
        }catch(IOException ioe){
            ioe.printStackTrace();
        }
    }

    //设置缓冲区大小
    public void setBufSize(int bufSize){
        this.bufSize = bufSize;
    }

    //测试AntZip类
    public static void main(String[] args)throws Exception{

            AntZip zip = new AntZip();
                
//                zip.doZip("D:/package/temp","D:/package/destination/test.zip");
                
                zip.unZip("D:/package/destination/test.zip","D:/package/temp/dir");
 
        }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值