java压缩解压文件

  利用Apache的commons-compress包实现对文件的压缩和解压

所需jar包:(代码中用到了文件拷贝,因此导入了commons-io包

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-compress</artifactId>
    <version>1.18</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.5</version>
</dependency>

具体实现:

public class ZipFileUtil {

    /**
     * 压缩文件
     * @param srcFilePath 需要压缩的文件路径
     * @param zipFilePath 压缩后文件(全路径的文件,例如:E:/test.zip)
     * @throws Exception
     */
    public static void compressFilesZip(String srcFilePath, String zipFilePath)throws Exception{
        Date start = new Date();
        System.out.println("压缩文件路径为:" + srcFilePath);
        if (srcFilePath == null || "".equals(srcFilePath.trim())){
            throw new Exception("压缩文件路径不能为空");
        }
        File srcFile = new File(srcFilePath);
        if (!srcFile.exists()){
            throw new Exception("文件目录不存在!");
        }
        File []files = srcFile.listFiles();
        if (files == null || files.length <= 0){
            throw new Exception("需压缩文件目录为空!");
        }
        List<String> allFileDir = getAllFiles(srcFilePath); //获取所有文件目录
        File resultZipFile = new File(zipFilePath);
        try(ZipArchiveOutputStream zipArchiveOutputStream = new ZipArchiveOutputStream(resultZipFile)) {
            zipArchiveOutputStream.setUseZip64(Zip64Mode.AsNeeded);
            //将每个文件用ZipArchiveEntry封装再写到压缩文件中
            addAllFilesToZip(srcFilePath, allFileDir, zipArchiveOutputStream);
            zipArchiveOutputStream.finish();
        }
        Date endDate = new Date();
        System.out.println("压缩执行时间为:" + (endDate.getTime()-start.getTime()));
    }

    /**
     * 把文件添加到压缩包中
     * @param srcFilePath
     * @param allFileDir
     * @param zipArchiveOutputStream
     * @throws IOException
     */
    private static void addAllFilesToZip(String srcFilePath, List<String> allFileDir, ZipArchiveOutputStream zipArchiveOutputStream) throws IOException {
        for (String fileDir : allFileDir) {
            File file = new File(fileDir);
            if (file.isDirectory()) {    //若是目录则不压缩
                continue;
            }
            //获取要压缩文件的相对路径,再将相对路径设置到压缩目录中完成对文件夹的压缩
            String fileName = getFileRelativePathName(srcFilePath, fileDir);
            ZipArchiveEntry zipArchiveEntry = new ZipArchiveEntry(file, fileName);
            zipArchiveOutputStream.putArchiveEntry(zipArchiveEntry);
            try (InputStream inputStream = new BufferedInputStream(new FileInputStream(file))) {
                IOUtils.copy(inputStream, zipArchiveOutputStream);
            }
            zipArchiveOutputStream.closeArchiveEntry();
        }
    }

    /**
     * 把zip解压到指定目录
     * @param zipFilePath 压缩包路径
     * @param saveFileDir 解压到目录
     */
    public static void decompressZip(String zipFilePath, String saveFileDir)throws Exception{
        System.out.println("解压文件为:" + zipFilePath);
        Date start = new Date();
        if (saveFileDir == null || "".equals(saveFileDir.trim())){
            throw new Exception("解压目录不能为空");
        }
        File zipFile = new File(zipFilePath);
        if (!zipFile.exists()){
            throw new Exception("需解压的文件不存在!");
        }
        //解压目录不存在创建目录
        File saveFilePath = new File(saveFileDir);
        if (!saveFilePath.exists()){
            saveFilePath.mkdirs();
        }
        try(InputStream inputStream = new FileInputStream(zipFile)){
            try (ZipArchiveInputStream zipArchiveInputStream = new ZipArchiveInputStream(inputStream)) {
                ArchiveEntry archiveEntry = null;
                while ((archiveEntry = zipArchiveInputStream.getNextEntry()) != null){
                    //解压时拷贝文件目录如若不存在则创建目录
                    String catalog = saveFileDir + "/" + archiveEntry.getName();
                    catalog = catalog.substring(0,catalog.lastIndexOf("/"));
                    File catalogFile = new File(catalog);
                    if (!catalogFile.exists()){
                        catalogFile.mkdirs();
                    }
                    try(OutputStream outputStream = new BufferedOutputStream(new FileOutputStream(new File(saveFileDir,archiveEntry.getName())))){
                        IOUtils.copyLarge(zipArchiveInputStream,outputStream);
                    }finally {
                        IOUtils.closeQuietly();
                    }
                }
            }
        }
        Date endDate = new Date();
        System.out.println("解压执行时间为:" + (endDate.getTime()-start.getTime()));
    }

    /**
     * 获取相对路径
     * @param dir
     * @param path
     * @return
     */
    public static String getFileRelativePathName(String dir, String path){
        if (!dir.endsWith("/")){
            dir = dir + "/";
        }
        String temp = path.substring(dir.length());
        return temp;
    }


    /**
     * 递归获取目录中所有文件
     * @param dir
     * @return
     */
    public static List<String> getAllFiles(String dir){
        List<String> allDirs = new ArrayList<>();
        File srcFile = new File(dir);
        File files[] = srcFile.listFiles();
        for (File file : files){
            if (file.isDirectory()){
                allDirs.add(file.getPath());
                allDirs.addAll(getAllFiles(file.getPath()));
            }else {
                allDirs.add(file.getPath());
            }
        }
        return allDirs;
    }

    //测试压缩与解压
    public static void main(String args[])throws Exception{
        compressFilesZip("E:/123","E:/123ABC.zip");
        decompressZip("E:/123ABC.zip","E:/1");
    }
}

 

posted @ 2019-06-26 21:38  筱小2  阅读(378)  评论(0编辑  收藏  举报