递归压缩文件及子文件夹(采用org.apache.tools.*中的方法避免中文文件名乱码)

 项目中需要使用流下载压缩文件夹,但在压缩过程中出现一个问题:压缩后中文文件名乱码,探究其原因是使用 java.util.*中的压缩,源码中已经制定文件名编码为“UTF-8”,因此,选用org.apache.tools.*包中的压缩,
指定文件名为GBK编码,以下是压缩文件以及子文件夹的方法:

public class ZipCompressor {

    /** 使用GBK编码可以避免压缩中文文件名乱码 */  
    private static final String CHINESE_CHARSET = "GBK";
    static final int BUFFER = 8192;     
    
    private File zipFile;     
      
    public ZipCompressor(String pathName) {     
        zipFile = new File(pathName);     
    }     
    public void compress(String... pathName) {   
        ZipOutputStream out = null;     
        try {    
            FileOutputStream fileOutputStream = new FileOutputStream(zipFile);     
            CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream, new CRC32());     
            out = new ZipOutputStream(cos);
            out.setEncoding(CHINESE_CHARSET);
            String basedir = "";   
            for (int i=0;i<pathName.length;i++){  
                compress(new File(pathName[i]), out, basedir);     
            }  
            out.close();    
        } catch (Exception e) {     
            throw new RuntimeException(e);     
        }   
    }     
    public void compress(String srcPathName) {     
        File file = new File(srcPathName);     
        if (!file.exists())     
            throw new RuntimeException(srcPathName + "不存在!");     
        try {     
            FileOutputStream fileOutputStream = new FileOutputStream(zipFile);     
            CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream, new CRC32());     
            ZipOutputStream out = new ZipOutputStream(cos);     
            String basedir = "";     
            compress(file, out, basedir);     
            out.close();     
        } catch (Exception e) {     
            throw new RuntimeException(e);     
        }     
    }     
    
    private void compress(File file, ZipOutputStream out, String basedir) {     
        /* 判断是目录还是文件 */    
        if (file.isDirectory()) {     
            this.compressDirectory(file, out, basedir);     
        } else {     
            this.compressFile(file, out, basedir);     
        }     
    }     
    
    /** 压缩一个目录 */    
    private void compressDirectory(File dir, ZipOutputStream out, String basedir) {     
        if (!dir.exists()){
           return;     
        }
    
        File[] files = dir.listFiles();     
        for (int i = 0; i < files.length; i++) {     
            /* 递归 */    
            compress(files[i], out, basedir + dir.getName() + "/");     
        }     
    }     
    
    /** 压缩一个文件 */    
    private void compressFile(File file, ZipOutputStream out, String basedir) {     
        if (!file.exists()) {
            return;
        }
        try {     
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));     
            ZipEntry entry = new ZipEntry(basedir + file.getName());     
            out.putNextEntry(entry);     
            int count;     
            byte data[] = new byte[BUFFER];     
            while ((count = bis.read(data, 0, BUFFER)) != -1) {     
                out.write(data, 0, count);     
            }
            bis.close();     
        } catch (Exception e) {     
            throw new RuntimeException(e);     
        }     
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_36490014/article/details/52904862