Home  >  Article  >  Java  >  Java practical case: Tool class for compressing files or folders into zip

Java practical case: Tool class for compressing files or folders into zip

php是最好的语言
php是最好的语言Original
2018-08-04 11:16:301929browse

The functions of this tool class are:

  • (1) It can compress files and folders

  • ( 2) Supports compressing multi-level folders at the same time, and the tool does recursive processing

  • (3) When encountering an empty folder, it can also be compressed

  • (4) You can choose whether to retain the original directory structure. If not, all files will go to the root directory of the compressed package, and empty folders will be discarded directly. Note: If the original directory structure of the file is not retained, compression will fail when files with the same file name are encountered.

  • (5) The code provides two methods for compressing files. The input parameter of one is the folder path and the other is the file list. The method can be selected according to actual needs.

    package com.tax.core.util; 
    2
    import java.io.File;
    3
    import java.io.FileInputStream;
    4
    import java.io.FileOutputStream;
    5
    import java.io.IOException;
    6
    import java.io.OutputStream;
    7
    import java.util.ArrayList;
    8
    import java.util.List;
    9
    import java.util.zip.ZipEntry;
    10
    import java.util.zip.ZipOutputStream;
    11
    12
    /**
    13
     * ZipUtils
    14
     * @author  ZENG.XIAO.YAN
    15
     * @date    2017年11月19日 下午7:16:08
    16
     * @version v1.0
    17
     */
    18
    public class ZipUtils {
    19
        
    20
        private static final int  BUFFER_SIZE = 2 * 1024;
    21
        
    22
        /**
    23
         * 压缩成ZIP 方法1
    24
         * @param srcDir 压缩文件夹路径 
    25
         * @param out    压缩文件输出流
    26
         * @param KeepDirStructure  是否保留原来的目录结构,true:保留目录结构; 
    27
         *                          false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)
    28
         * @throws RuntimeException 压缩失败会抛出运行时异常
    29
         */
    30
        public static void toZip(String srcDir, OutputStream out, boolean KeepDirStructure)
    31
                throws RuntimeException{
    32
            
    33
            long start = System.currentTimeMillis();
    34
            ZipOutputStream zos = null ;
    35
            try {
    36
                zos = new ZipOutputStream(out);
    37
                File sourceFile = new File(srcDir);
    38
                compress(sourceFile,zos,sourceFile.getName(),KeepDirStructure);
    39
                long end = System.currentTimeMillis();
    40
                System.out.println("压缩完成,耗时:" + (end - start) +" ms");
    41
            } catch (Exception e) {
    42
                throw new RuntimeException("zip error from ZipUtils",e);
    43
            }finally{
    44
                if(zos != null){
    45
                    try {
    46
                        zos.close();
    47
                    } catch (IOException e) {
    48
                        e.printStackTrace();
    49
                    }
    50
                }
    51
            }
    52
            
    53
        }
    54
        
    55
        /**
    56
         * 压缩成ZIP 方法2
    57
         * @param srcFiles 需要压缩的文件列表
    58
         * @param out           压缩文件输出流
    59
         * @throws RuntimeException 压缩失败会抛出运行时异常
    60
         */
    61
        public static void toZip(List<File> srcFiles , OutputStream out)throws RuntimeException {
    62
            long start = System.currentTimeMillis();
    63
            ZipOutputStream zos = null ;
    64
            try {
    65
                zos = new ZipOutputStream(out);
    66
                for (File srcFile : srcFiles) {
    67
                    byte[] buf = new byte[BUFFER_SIZE];
    68
                    zos.putNextEntry(new ZipEntry(srcFile.getName()));
    69
                    int len;
    70
                    FileInputStream in = new FileInputStream(srcFile);
    71
                    while ((len = in.read(buf)) != -1){
    72
                        zos.write(buf, 0, len);
    73
                    }
    74
                    zos.closeEntry();
    75
                    in.close();
    76
                }
    77
                long end = System.currentTimeMillis();
    78
                System.out.println("压缩完成,耗时:" + (end - start) +" ms");
    79
            } catch (Exception e) {
    80
                throw new RuntimeException("zip error from ZipUtils",e);
    81
            }finally{
    82
                if(zos != null){
    83
                    try {
    84
                        zos.close();
    85
                    } catch (IOException e) {
    86
                        e.printStackTrace();
    87
                    }
    88
                }
    89
            }
    90
        }
    91
        
    92
        
    93
        /**
    94
         * 递归压缩方法
    95
         * @param sourceFile 源文件
    96
         * @param zos        zip输出流
    97
         * @param name       压缩后的名称
    98
         * @param KeepDirStructure  是否保留原来的目录结构,true:保留目录结构; 
    99
         *                          false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)
    100
         * @throws Exception
    101
         */
    102
        private static void compress(File sourceFile, ZipOutputStream zos, String name,
    103
                boolean KeepDirStructure) throws Exception{
    104
            byte[] buf = new byte[BUFFER_SIZE];
    105
            if(sourceFile.isFile()){
    106
                // 向zip输出流中添加一个zip实体,构造器中name为zip实体的文件的名字
    107
                zos.putNextEntry(new ZipEntry(name));
    108
                // copy文件到zip输出流中
    109
                int len;
    110
                FileInputStream in = new FileInputStream(sourceFile);
    111
                while ((len = in.read(buf)) != -1){
    112
                    zos.write(buf, 0, len);
    113
                }
    114
                // Complete the entry
    115
                zos.closeEntry();
    116
                in.close();
    117
            } else {
    118
                File[] listFiles = sourceFile.listFiles();
    119
                if(listFiles == null || listFiles.length == 0){
    120
                    // 需要保留原来的文件结构时,需要对空文件夹进行处理
    121
                    if(KeepDirStructure){
    122
                        // 空文件夹的处理
    123
                        zos.putNextEntry(new ZipEntry(name + "/"));
    124
                        // 没有文件,不需要文件的copy
    125
                        zos.closeEntry();
    126
                    }
    127
                    
    128
                }else {
    129
                    for (File file : listFiles) {
    130
                        // 判断是否需要保留原来的文件结构
    131
                        if (KeepDirStructure) {
    132
                            // 注意:file.getName()前面需要带上父文件夹的名字加一斜杠,
    133
                            // 不然最后压缩包中就不能保留原来的文件结构,即:所有文件都跑到压缩包根目录下了
    134
                            compress(file, zos, name + "/" + file.getName(),KeepDirStructure);
    135
                        } else {
    136
                            compress(file, zos, file.getName(),KeepDirStructure);
    137
                        }
    138
                        
    139
                    }
    140
                }
    141
            }
    142
        }
    143
        
    144
        public static void main(String[] args) throws Exception {
    145
            /** 测试压缩方法1  */
    146
            FileOutputStream fos1 = new FileOutputStream(new File("c:/mytest01.zip"));
    147
            ZipUtils.toZip("D:/log", fos1,true);
    148
            
    149
            /** 测试压缩方法2  */
    150
            List<File> fileList = new ArrayList<>();
    151
            fileList.add(new File("D:/Java/jdk1.7.0_45_64bit/bin/jar.exe"));
    152
            fileList.add(new File("D:/Java/jdk1.7.0_45_64bit/bin/java.exe"));
    153
            FileOutputStream fos2 = new FileOutputStream(new File("c:/mytest02.zip"));
    154
            ZipUtils.toZip(fileList, fos2);
    155
        }
    156
    }

    Related articles:

    php code to compress a folder into a zip file

    php code to compress a folder into a zip file php code

The above is the detailed content of Java practical case: Tool class for compressing files or folders into zip. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn