java对zip进行压缩和解压

来源:互联网 发布:js的面向对象编程理解 编辑:程序博客网 时间:2024/05/21 07:45
import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.Closeable;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import java.util.zip.ZipEntry;import java.util.zip.ZipInputStream;import java.util.zip.ZipOutputStream;/** *  Zip压缩解压缩 *  @author LuoZq */public final class ZipUtils {public static final String SUFFIX_NAME = "zip";/** *  压缩文件 *  @param zipFile 压缩文件名路径 *  @param fileList 待压缩的文件集合 *  @param isDeleteRes 如果出现同名压缩包, 是否删除原本的压缩包, 如果false,且出现同名则抛异常 *  @return 压缩后的压缩包File */public static File compress(String zipFile, List<File> fileList, boolean isDelete){File f = isCheckFileNameByZip(zipFile);return compress( f.getName(), f.getParent(), getFilePathArray(fileList), false, isDelete );}/** *  压缩文件 *  @param zipFile 压缩文件名路径 *  @param fileList 待压缩的文件集合 *  @return 压缩后的压缩包File */public static File compress(String zipFile, List<File> fileList){return compress( zipFile, fileList, true );}/** *  校验目标文件名称是否是zip格式 *  @param zipFile *  @return */private static File isCheckFileNameByZip(String zipFile){return new File(zipFile.substring(0, isCheckFileNameInZip(zipFile)));}/** *  校验目标文件名称是否是zip格式 *  @param zipFile *  @return */private static int isCheckFileNameInZip(String zipFile){int las = zipFile.lastIndexOf(".");if(las == -1){throw new RuntimeException( zipFile + " is not zip format! this format = ??? ");}String format = zipFile.substring(las + 1);if(!SUFFIX_NAME.equalsIgnoreCase(format)){throw new RuntimeException( zipFile + " is not zip format! this format = " + format);}return las;}private static String[] getFilePathArray (List<File> list){String[] strs = new String[list.size()];for(int index = 0; index < strs.length; index++){strs[index] = list.get(index).getPath();}return strs;}/** *  压缩文件 *  @param zipName 压缩文件名, 无需加后缀 *  @param zipFilePath 压缩路径 *  @param filePaths 待压缩的文件路径 *  @param isNewFolder 是否在压缩包新建同名文件夹 *  @param isDeleteRes 如果出现同名压缩包, 是否删除原本的压缩包, 如果false,且出现同名则抛异常 *  @return 压缩后的压缩包File */    private static File compress(String zipName,String zipFilePath, String[] filePaths, boolean isNewFolder, boolean isDeleteRes) {        File target = null;        File source = new File(zipFilePath);        if (source.exists()) {        String base = isNewFolder? zipName + File.separator: "";            zipName = zipName + "." + SUFFIX_NAME;// 压缩文件名=源文件名.zip            target = new File(source.getPath(), zipName);            if (target.exists()) {            if(!isDeleteRes){            throw new RuntimeException("Compression package name repetition !");            }            target.delete(); // 删除旧的文件            }            FileOutputStream fos = null;            ZipOutputStream zos = null;            try {                fos = new FileOutputStream(target);                zos = new ZipOutputStream(new BufferedOutputStream(fos));                // 添加对应的文件Entry                for(String fip:filePaths){                addEntry(base, new File(fip), zos);                }            } catch (IOException e) {                throw new RuntimeException(e);            } finally {                closeQuietly(zos, fos);            }        }        return target;    }    /**     *  解压文件     *  filePath所代表文件系统不能与targetStr一致     *  @param filePath 压缩文件路径     *  @param targetStr 解压至所在文件目录     */    public static void decompression(String filePath, String targetStr) {    isCheckFileNameInZip(filePath);        File source = new File(filePath);        if (source.exists()) {            ZipInputStream zis = null;            BufferedOutputStream bos = null;            try {                zis = new ZipInputStream(new FileInputStream(source));                ZipEntry entry = null;                while ((entry = zis.getNextEntry()) != null && !entry.isDirectory()) {                    File target = new File(targetStr, entry.getName());                    if (!target.getParentFile().exists()) {                    target.getParentFile().mkdirs();// 创建文件父目录                    }                    // 写入文件                    bos = new BufferedOutputStream(new FileOutputStream(target));                    int read = 0;                    byte[] buffer = new byte[1024 * 10];                    while ((read = zis.read(buffer, 0, buffer.length)) != -1) {                        bos.write(buffer, 0, read);                    }                    bos.flush();                }                zis.closeEntry();            } catch (Exception e) {                throw new RuntimeException(e);            } finally {                closeQuietly(zis, bos);            }        }    }    /**     *  扫描添加文件Entry     *  @param base 基路径     *  @param source 源文件     *  @param zos Zip文件输出流     *  @throws IOException     */    private static void addEntry(String base, File source, ZipOutputStream zos) throws IOException {        // 按目录分级,形如:/aaa/bbb.txt        String entry = base.concat(source.getName());        if (source.isDirectory()) {            for (File file : source.listFiles()) {                // 递归列出目录下的所有文件,添加文件Entry                addEntry(entry + File.separator, file, zos);            }        } else {            FileInputStream fis = null;            BufferedInputStream bis = null;            try {                byte[] buffer = new byte[1024 * 10];                fis = new FileInputStream(source);                bis = new BufferedInputStream(fis, buffer.length);                int read = 0;                zos.putNextEntry(new ZipEntry(entry));                while ((read = bis.read(buffer, 0, buffer.length)) != -1) {                    zos.write(buffer, 0, read);                }                zos.closeEntry();            } finally {                closeQuietly(bis, fis);            }        }    }private ZipUtils(){}/**     * 关闭一个或多个流对象     *      * @param closeables     *            可关闭的流对象列表     */    public static void closeQuietly(Closeable... closeables) {        try {        if (closeables != null && closeables.length > 0) {                for (Closeable closeable : closeables) {                    if (closeable != null) {                        closeable.close();                    }                }            }        } catch (IOException e) {            // do nothing        }    }        public static void main(String[] args) {    String res = "G://test";    List<File> list = Arrays.asList( new File(res).listFiles() );    compress("G://testOne.zip", list);    decompression("G://testOne.zip", "G://testOne1.zip");}}

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 男生的照片 女生和男生 男生鞋子 男生自拍照 男生套图 男生喜欢 男生图 男生节 照片男生 男生的秘密 男生发育 男生和女生 男生相片 男生衣服 男生被 男生的图片 男生英语 男生英文 男生日记本 男生洗澡 男生为什么 男生下体 男生打耳洞 男生有什么 男生阴毛多 男生的那个 男生乳头 男生垫鼻子 男生腰痛 男生版 男生照片大全 男生的照片大全 男生中分卷发发型图片 男生生活照片 男生那个图片 男生怎么变帅 男生中分怎么留 男生发型名称大全 男生图片 帅气大图 男生和女生那个疼吗 男生全身图片