java原生的zip压缩与解压缩实现

因项目中使用大量图片上传功能,请求次数过多,导致占用过多网络资源.优化改为压缩zip一次性上传.

测试数据:  10个文件 总共为1.8G  压缩总时长为1分10秒;    解压缩时长24秒

测试环境:ubuntu 13, jdk 1.8

缺点:1 压缩文件不能为文件夹

2 压缩比例不明显,文件大小没怎么缩小


/**
     * 压缩
     *
     * @param files
     *            压缩的文件
     * @param zipPath
     *            压缩zip存放路径
     * @param original
     *            是否删除原文件
     * @throws Exception
     */
    public static void zip(File[] files, String zipPath, boolean original) throws Exception {
        if (files == null || files.length == 0) {
            throw new Exception("file列表错误,不能为空");
        }
        if (StringUtils.isBlank(zipPath)) {
            throw new Exception("压缩文件存放路径不能为空");
        }
        if (new File(zipPath).exists()) {
            new File(zipPath).delete();
        }
        logger.info("{msg:'[{}]开始压缩,millis:[{}]'}", LocalDateTime.now().toString(), Instant.now().getMillis());
        zipPath = StringUtils.replace(zipPath, "\\", "/");
        File zipfile = new File(StringUtils.substringBeforeLast(zipPath, File.separator));
        if (!zipfile.exists()) {
            if (!zipfile.createNewFile()) {
                throw new Exception("文件目录生成失败!");
            }
        }

        for (File file : files) {
            if (file.isDirectory()) {
                throw new Exception("只能压缩文件,不能压缩文件夹");
            }
        }

        FileOutputStream fos = null;
        ZipOutputStream zos = null;
        try {
            fos = new FileOutputStream(zipPath);
            byte[] buffer = new byte[8192];
            zos = new ZipOutputStream(fos, Charset.forName("UTF-8"));
            for (File file : files) {
                ZipEntry entry = new ZipEntry(file.getName());
                entry.setComment(file.getName() + ",大小:" + file.length());
                entry.setSize(file.length());
                zos.putNextEntry(entry);
                FileInputStream fis = new FileInputStream(file);
                int read = 0;
                while ((read = fis.read(buffer)) != -1) {
                    zos.write(buffer, 0, read);
                }
                fis.close();
            }
        } catch (Exception e) {
            throw e;
        } finally {
            if (zos != null)
                zos.close();
            if (fos != null)
                fos.close();
        }
        if (original) {
            for (File file : files) {
                file.delete();
            }
        }
        logger.info("{msg:'[{}]压缩完成,millis:[{}]'}", LocalDateTime.now().toString(), Instant.now().getMillis());
    }

    /**
     * 解压缩
     *
     * @param zipFile
     *            需解压缩文件
     * @param unzipfile
     *            解压缩存放的文件夹名
     * @throws Exception
     */
    public static void unzip(String zipFile, String unzipfile) throws Exception {
        if (!new File(zipFile).exists()) {
            throw new Exception("解压缩文件不存在");
        }
        if (!new File(unzipfile).exists()) {
            new File(unzipfile).mkdirs();
        }
        logger.info("{msg:'[{}]开始解压缩文件,millis:[{}]'}", LocalDateTime.now().toString(), Instant.now().getMillis());
        ZipFile file = new ZipFile(zipFile);
        byte[] buffer = new byte[8192];
        Enumeration e = file.entries();
        while (e.hasMoreElements()) {
            ZipEntry entry = e.nextElement();
            File f = new File(unzipfile + File.separator + entry.getName());
            if (!f.exists()) {
                f.createNewFile();
            }
            FileOutputStream fos = null;
            InputStream is = null;
            try {
                fos = new FileOutputStream(f);
                is = file.getInputStream(entry);
                int read = 0;
                while ((read = is.read(buffer)) != -1) {
                    fos.write(buffer, 0, read);
                }
            } catch (Exception e2) {
                throw e2;
            } finally {
                if (is != null)
                    is.close();
                if (fos != null)
                    fos.close();
            }
        }
        logger.info("{msg:'[{}]解压缩文件完成,millis:[{}]'}", LocalDateTime.now().toString(), Instant.now().getMillis());
    }

有更做优方法请指正.


QQ:376987715交流学习

你可能感兴趣的:(java,技术)