java后端提供循环解压缩zip以及压缩zip工具类/方法.附带一个删除临时文件的方法

in java with 0 comment

好久没写文章了,是时候发布一篇了!最近工作是真的有够忙,多线开花.
这里提供一个自用的解压压缩版本,可以循环解压缩,可以打包一整个文件夹内的所有文件.
全部应用的jdk1.8自带的工具类.欢迎使用.

解压方法:

/**
     * 指定解压单个文件(可循环调用)
     * @param zipFile 解压的文件路径含文件本身
     * @param descDir 解压到某个路径
     * @Author Maiza
     */
    public static void unZipFile(File zipFile,String descDir) {
        File pathFile = new File(descDir);
        OutputStream out = null;
        InputStream in = null;
        ZipFile zip = null;
        try{
            if (!pathFile.exists()) {
                pathFile.mkdirs();
            }
            //设置处理压缩包语言
            zip = new ZipFile(zipFile, Charset.forName("UTF-8"));
            //开始循环解压缩
            for (Enumeration entries = zip.entries(); entries.hasMoreElements(); ) {
                ZipEntry entry = (ZipEntry) entries.nextElement();
                String zipEntryName = entry.getName();
                in = zip.getInputStream(entry);
                String outPath = (descDir + zipEntryName).replaceAll("\\*", "/");
                //判断路径是否存在,不存在则创建文件路径
                File file = new File(outPath.substring(0, outPath.lastIndexOf('/')));
                if (!file.exists()) {
                    file.mkdirs();
                }
                //判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压
                if (new File(outPath).isDirectory()) {
                    continue;
                }

                out = new FileOutputStream(outPath);
                byte[] buf1 = new byte[1024];
                int len;
                while ((len = in.read(buf1)) > 0) {
                    out.write(buf1, 0, len);
                }
                //每次循环关闭一次流,避免资源泄露.如果不关闭,系统将一直占用资源.
                out.close();
                in.close();
            }
        } catch (Exception e){
            log.error("unZipFile", e);
        } finally {
            try {
                out.close();
                in.close();
                zip.close();
            } catch (Exception e){
                log.error( "finally:" + e.toString());
            }
        }
    }

压缩方法:

/**
     * 压缩文件
     *
     * @param sourceFilePath 源文件路径
     * @param zipFilePath    压缩后文件存储路径
     * @param zipFilename    压缩文件名
     * @Author Maiza
     */
    public static void compressToZip(String sourceFilePath, String zipFilePath, String zipFilename) {
        File sourceFile = new File(sourceFilePath);
        File zipPath = new File(zipFilePath);
        FileOutputStream fos = null;
        ZipOutputStream zos = null;
        if (!zipPath.exists()) {
            zipPath.mkdirs();
        }

        File zipFile = new File(zipPath + "/" + zipFilename);
        try {
            fos = new FileOutputStream(zipFile);
            zos = new ZipOutputStream(fos);
            writeZip(sourceFile, "", zos);
            //文件压缩完成后,删除被压缩文件
            boolean flag = deleteDir(sourceFile);
            log.info("删除被压缩文件[" + sourceFile + "]标志:{}", flag);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e.getMessage(), e.getCause());
        } finally {
            try{
                zos.close();
                fos.close();
            } catch (Exception e){
                log.error("compressToZip发生错误:", e);
            }

        }
    }

    /**
     * 遍历所有文件,压缩
     *
     * @param file       源文件目录
     * @param parentPath 压缩文件目录
     * @param zos        文件流
     * @Author Maiza
     */
    private static void writeZip(File file, String parentPath, ZipOutputStream zos) {
        if (file.isDirectory()) {
            //目录
            parentPath += file.getName() + "/";
            File[] files = file.listFiles();
            for (File f : files) {
                writeZip(f, parentPath, zos);
            }
        } else {
            //文件
            FileInputStream fis = null;
            BufferedInputStream bis = null;
            try {
                fis = new FileInputStream(file);
                bis = new BufferedInputStream(fis);
                //指定zip文件夹,ZipEntry里的参数决定了压缩文件里的结构
                ZipEntry zipEntry = new ZipEntry(file.getName());
                zos.putNextEntry(zipEntry);
                int len;
                byte[] buffer = new byte[1024 * 10];
                while ((len = bis.read(buffer, 0, buffer.length)) != -1) {
                    zos.write(buffer, 0, len);
                    zos.flush();
                }
            } catch (Exception e) {
                e.printStackTrace();
                throw new RuntimeException(e.getMessage(), e.getCause());
            } finally {
                try {
                    bis.close();
                    fis.close();
                } catch (IOException e) {
                    log.error("writeZip出现错误:", e);
                }
            }
        }
    }

附带一个删除临时解压缩路径内所有文件的方法配合压缩方法使用

/**
     * 删除文件夹
     *
     * @param dir
     * @return
     */
    public static boolean deleteDir (File dir){
        if (dir.isDirectory()) {
            String[] children = dir.list();
            for (int i = 0; i < children.length; i++) {
                boolean success = deleteDir(new File(dir, children[i]));
                if (!success) {
                    return false;
                }
            }
        }
        //删除空文件夹
        return dir.delete();
    }