您的位置:首页 > 编程语言 > Java开发

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

2017-10-20 14:13 591 查看
最近在工作中做了一个文件的压缩并下载的功能,在此做下记录。文件压缩的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");    

    }  

}   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 压缩 乱码