java实现文件的压缩解决服务器(亲测windows server 2008)中文乱码

时间:2022-01-01 12:13:15

最近在工作中做了一个文件的压缩并下载的功能,在此做下记录。文件压缩的jar包使用ant的jar,一开始用的jdk本身的jar,但是出现了在本地测试没有问题,但是在客户服务器(windowsServers 2008)上出现压缩后的压缩包内的中文文件名乱码问题。经过网上查询并且测试,发现引用ant 的org.apache.tools.zip.ZipOutputStream不存在此问题。ant包存在ZipOutputStream.setEncoding("GBK");方法。通过此方法可以解决上面的问题。而jdk的zip包并没有这个方法。

下面把具体的压缩代码贴出来同大家参考:

package com.dhc.msf.common;
import java.io.BufferedInputStream;  
import java.io.File;  
import java.io.FileInputStream;  
import java.io.FileOutputStream;  
import java.util.zip.CRC32;  
import java.util.zip.CheckedOutputStream;  
import org.apache.tools.zip.ZipEntry;  
import org.apache.tools.zip.ZipOutputStream;  


import org.apache.log4j.Logger;


  
public class ZipCompressor {     
    static final int BUFFER = 8192;     
    
    private File zipFile; 
    
private Logger log = Logger.getLogger(ZipCompressor.class);


    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("GBK");//解决中文乱码
            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); 
            out.setEncoding("GBK");
            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()) {     
            System.out.println("压缩:" + basedir + file.getName());  
            this.compressDirectory(file, out, basedir);     
        } else {     
            System.out.println("压缩:" + basedir + file.getName()); 
            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());
            log.info("被压缩的文件名:"+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);     
        }     
    }     
   public static void main(String[] args) {     
        ZipCompressor zc = new ZipCompressor("E:/resource/resource.zip");     
        zc.compress("E:/resource/20160515100923078.jpg","E:/resource/20160515100923446.jpg","E:/resource/20160515100923684.jpg","E:/resource/busi.xml");    
    }  
}