Heim  >  Artikel  >  Java  >  Java-Praxisfall: Tool-Klasse zum Komprimieren von Dateien oder Ordnern in zip

Java-Praxisfall: Tool-Klasse zum Komprimieren von Dateien oder Ordnern in zip

php是最好的语言
php是最好的语言Original
2018-08-04 11:16:301919Durchsuche

Die Funktionen dieses Tools sind:

  • (1) Es kann Dateien und Ordner komprimieren

  • (2) Unterstützt Komprimieren Sie mehrstufige Ordner gleichzeitig und das Tool führt eine rekursive Verarbeitung im Inneren durch

  • (3) Wenn Sie auf einen leeren Ordner stoßen, können Sie ihn auch komprimieren

  • (4) Sie können wählen, ob die ursprüngliche Verzeichnisstruktur beibehalten werden soll. Andernfalls werden alle Dateien in das Stammverzeichnis des komprimierten Pakets verschoben und leere Ordner werden direkt verworfen. Hinweis: Wenn die ursprüngliche Verzeichnisstruktur der Datei nicht beibehalten wird, schlägt die Komprimierung fehl, wenn Dateien mit demselben Dateinamen gefunden werden.

  • (5) Der Code bietet zwei Methoden zum Komprimieren von Dateien. Der Eingabeparameter ist der Ordnerpfad und der andere die Dateiliste. Die Methode kann entsprechend den tatsächlichen Anforderungen ausgewählt werden .

    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
    }

    Verwandte Artikel:

    PHP-Code zum Komprimieren eines Ordners in eine ZIP-Datei

    PHP-Code zum Komprimieren eines Ordners in eine ZIP-Datei PHP-Code

Das obige ist der detaillierte Inhalt vonJava-Praxisfall: Tool-Klasse zum Komprimieren von Dateien oder Ordnern in zip. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn