Maison  >  Article  >  Java  >  Cas pratique Java : Classe d'outils pour compresser des fichiers ou des dossiers en zip

Cas pratique Java : Classe d'outils pour compresser des fichiers ou des dossiers en zip

php是最好的语言
php是最好的语言original
2018-08-04 11:16:301878parcourir

Les fonctions de cet outil sont :

  • (1) Il peut compresser des fichiers et des dossiers

  • (2) Supports compressant des dossiers à plusieurs niveaux en même temps, et l'outil effectue un traitement récursif à l'intérieur de

  • (3) Lorsque vous rencontrez un dossier vide, vous pouvez également le compresser

  • (4) Vous pouvez choisir de conserver la structure de répertoires d'origine. Sinon, tous les fichiers iront dans le répertoire racine du package compressé et les dossiers vides seront directement supprimés. Remarque : Si la structure de répertoires d'origine du fichier n'est pas conservée, la compression échouera lorsque des fichiers portant le même nom de fichier seront rencontrés.

  • (5) Le code fournit deux méthodes pour compresser les fichiers. Le paramètre d'entrée de l'une est le chemin du dossier et l'autre est la liste des fichiers. La méthode peut être sélectionnée en fonction des besoins réels. .

    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
    }

    Articles associés :

    Code php pour compresser un dossier dans un fichier zip

    Code php pour compresser un dossier dans un fichier zip code php

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn