Java操作zip压缩和解压缩文件工具类

来源:互联网 发布:jquery ajax 遍历json 编辑:程序博客网 时间:2024/05/01 14:39
package com.zhihua.file;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.ArrayList;import java.util.Enumeration;import java.util.List;import org.apache.tools.zip.ZipEntry;import org.apache.tools.zip.ZipFile;import org.apache.tools.zip.ZipOutputStream;/** * Java操作zip压缩和解压缩文件工具类 * 由于直接使用java.util.zip工具包下的类,会出现中文乱码问题,所以使用ant.jar中的org.apache.tools.zip下的工具类 * <请替换成功能描述> <br> * <请替换成详细描述> * @author caizh * @since [1.0.0] * @version [1.0.0,2017年2月6日] */public class ZipUtils {    private static byte[] _byte = new byte[1024];    /**     * 对.zip文件进行解压     * <请替换成功能描述> <br>     * <请替换成详细描述>     * @param zipFile 解压缩文件     * @param targetPath 压缩的目标地址     * @return     * @author caizh     * @since [1.0.0]     * @version [1.0.0,2017年2月6日]     */    @SuppressWarnings("rawtypes")    public static List<File> decompressionZipFile(File zipFile,String targetPath){        List<File> list = new ArrayList<File>();        try{            ZipFile _zipFile = new ZipFile(zipFile,"GBK");            for(Enumeration entries = _zipFile.getEntries();entries.hasMoreElements();){                ZipEntry entry = (ZipEntry) entries.nextElement();                File _file = new File(targetPath+File.separator+entry.getName());                if(entry.isDirectory()){                    _file.mkdirs();                }else{                    File _parent = _file.getParentFile();                    if(!_parent.exists()){                        _parent.mkdirs();                    }                    InputStream _in = _zipFile.getInputStream(entry);                    OutputStream _out = new FileOutputStream(_file);                    int len = 0;                    while((len=_in.read(_byte))>0){                        _out.write(_byte, 0, len);                    }                    _in.close();                    _out.flush();                    _out.close();                    list.add(_file);                }            }         }catch(Exception e){            e.printStackTrace();        }        return list;    }    /**     * 压缩zip文件     * <请替换成功能描述> <br>     * <请替换成详细描述>     * @param targetPath 压缩的目的地址 如:E:/xxx.zip     * @param sourceFiles 压缩的源文件     * @author caizh     * @since [1.0.0]     * @version [1.0.0,2017年2月6日]     */    public static void compressZipFile(String targetPath,List<File> sourceFiles){        try{            if(targetPath.endsWith(".zip")|| targetPath.endsWith(".ZIP")){                ZipOutputStream zipOutStream = new ZipOutputStream(new FileOutputStream(new File(targetPath)));                zipOutStream.setEncoding("GBK");                for (File file : sourceFiles) {                    addSourceFile(targetPath, zipOutStream, file, "");                }                zipOutStream.close();            }else{                System.out.println("target file["+targetPath+"] is not .zip type file");            }        }catch(Exception e){            e.printStackTrace();        }    }    /**     * 压缩文件 注:如果压缩文件是一个文件夹,那压缩包存放的位置不能在该文件夹下     * <请替换成功能描述> <br>     * <请替换成详细描述>     * @param targetPath 压缩的目的地址     * @param zipOutStream      * @param sourceFile 被压缩的文件     * @param path 在zip中的相对路径     * @author caizh     * @since [1.0.0]     * @version [1.0.0,2017年2月6日]     * @throws IOException      */    private static void addSourceFile(String targetPath,ZipOutputStream zipOutStream,File sourceFile,String path) throws IOException{        System.out.println("begin to compression file["+sourceFile.getName()+"]");        if(!"".equals(path) && !path.endsWith(File.separator)){            path += File.separator;        }        if(!sourceFile.getPath().equals(targetPath)){            if(sourceFile.isDirectory()){                File[] files = sourceFile.listFiles();                if(files.length==0){                    zipOutStream.putNextEntry(new ZipEntry(path+sourceFile.getName()+File.separator));                    zipOutStream.closeEntry();                }else{                    for(File f:files){                        addSourceFile(targetPath, zipOutStream, f, path+sourceFile.getName());                    }                }            }else{                InputStream in = new FileInputStream(sourceFile);                zipOutStream.putNextEntry(new ZipEntry(path+sourceFile.getName()));                int len = 0;                while((len=in.read(_byte))>0){                    zipOutStream.write(_byte,0,len);                }                in.close();                zipOutStream.closeEntry();            }        }    }}

测试类:

package com.zhihua.file.test;import java.io.File;import java.util.ArrayList;import java.util.List;import org.junit.Test;import com.zhihua.file.ZipUtils;public class ZipUtilsTest {    /**     * 解压文件     * <请替换成功能描述> <br>     * <请替换成详细描述>     * @author caizh     * @since [1.0.0]     * @version [1.0.0,2017年2月6日]     */    @Test    public void decompressionZipFile(){        String zipPath = "E:/mkdir/copy/test.zip";        File zipFile = new File(zipPath);        String targetPath = "E:/mkdir/zip/";        ZipUtils.decompressionZipFile(zipFile, targetPath);    }    /**     * 压缩文件     * <请替换成功能描述> <br>     * <请替换成详细描述>     * @author caizh     * @since [1.0.0]     * @version [1.0.0,2017年2月6日]     */    @Test    public void compressZipFile(){        File f1 = new File("E:/mkdir/copy/free.ftl");        File f2 = new File("E:/mkdir/del/login.wav");        List<File> list = new ArrayList<File>();        list.add(f1);        list.add(f2);        String targetPath = "E:/mkdir/del/compress.zip";        ZipUtils.compressZipFile(targetPath, list);    }}
0 0
原创粉丝点击