把多个文件打包压缩成ZIP文件

来源:互联网 发布:2016年人口老龄化数据 编辑:程序博客网 时间:2024/04/20 12:35

导包的时候一定导org.apache.tools.zip下的包,不要导JDK的zip包,JDK的包在文件名为中文的情况下,打包是会乱码的。在apache的包下,可以设置编码。直接看代码:


import java.io.BufferedInputStream;import java.io.DataInputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import org.apache.tools.zip.ZipEntry;import org.apache.tools.zip.ZipOutputStream;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class ZipUtils {    private static final Logger log = LoggerFactory.getLogger(ZipUtils.class);            private ZipUtils(){};   /**     * 创建ZIP文件     * @param sourcePath 文件或文件夹路径     * @param zipPath 生成的zip文件存在路径(包括文件名)     */    public static void createZip(String sourcePath, String zipPath) {        FileOutputStream fos = null;        ZipOutputStream zos = null;        try {            fos = new FileOutputStream(zipPath);            zos = new ZipOutputStream(fos);            writeZip(new File(sourcePath), "", zos);        } catch (FileNotFoundException e) {            log.error("创建ZIP文件失败",e);        } finally {            try {                if (zos != null) {                    zos.close();                }            } catch (IOException e) {                log.error("创建ZIP文件失败",e);            }        }    }        private static void writeZip(File file, String parentPath, ZipOutputStream zos) {        if(file.exists()){        //处理文件夹            if(file.isDirectory()){                parentPath+=file.getName()+File.separator;                File [] files=file.listFiles();                for(File f:files){                    writeZip(f, parentPath, zos);                }            }else{                FileInputStream fis=null;                DataInputStream dis=null;                try {                    fis=new FileInputStream(file);                    dis=new DataInputStream(new BufferedInputStream(fis));                    ZipEntry ze = new ZipEntry(parentPath + file.getName());                    zos.putNextEntry(ze);                    //添加编码,如果不添加,当文件以中文命名的情况下,会出现乱码                    // ZipOutputStream的包一定是apache的ant.jar包。JDK也提供了打压缩包,但是不能设置编码                    zos.setEncoding("GBK");                    byte [] content=new byte[1024];                    int len;                    while((len=fis.read(content))!=-1){                        zos.write(content,0,len);                        zos.flush();                    }                } catch (FileNotFoundException e) {                    log.error("创建ZIP文件失败",e);                } catch (IOException e) {                    log.error("创建ZIP文件失败",e);                }finally{                    try {                        if(dis!=null){                            dis.close();                        }                    }catch(IOException e){                        log.error("创建ZIP文件失败",e);                    }                }            }        }    }        public static void main(String[] args) {    //测试把F盘下的所有文件打包压缩成sql.zip文件放在F盘根目录下        ZipUtils.createZip("F:/", "F:/sql.zip");            }}


原创粉丝点击