zoukankan      html  css  js  c++  java
  • 简单测试Demo:如何用Java压缩文件夹和文件

    一、直接贴出测试代码

      1 package com.jason.zip; 
      2 
      3 import java.io.File;
      4 import java.io.FileInputStream;
      5 import java.io.FileOutputStream;
      6 import java.io.IOException;
      7 import java.io.OutputStream;
      8 import java.util.ArrayList;
      9 import java.util.List;
     10 import java.util.zip.ZipEntry;
     11 import java.util.zip.ZipOutputStream;
     12 /**
     13  * 压缩文件夹或批量压缩文件
     14  * @function  
     15  * @author 小风微凉
     16  * @time  2018-9-14 下午2:12:45
     17  */
     18 public class ZipAction {
     19     private static final int  BUFFER_SIZE = 2 * 1024;
     20     /**
     21      * 压缩成ZIP 
     22      * @param srcDir 压缩文件夹路径 
     23      * @param out    压缩文件输出流
     24      * @param KeepDirStructure  是否保留原来的目录结构,true:保留目录结构; 
     25      *                          false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)
     26      * @throws RuntimeException 压缩失败会抛出运行时异常
     27      */
     28     public static void toZip(String srcDir, OutputStream out, boolean KeepDirStructure)
     29             throws RuntimeException{
     30         long start = System.currentTimeMillis();
     31         ZipOutputStream zos = null ;
     32         try {
     33             zos = new ZipOutputStream(out);
     34             File sourceFile = new File(srcDir);
     35             compress(sourceFile,zos,sourceFile.getName(),KeepDirStructure);
     36             long end = System.currentTimeMillis();
     37             System.out.println("压缩完成,耗时:" + (end - start) +" ms");
     38         } catch (Exception e) {
     39             throw new RuntimeException("zip error from ZipAction",e);
     40         }finally{
     41             if(zos != null){
     42                 try {
     43                     zos.close();
     44                 } catch (IOException e) {
     45                     e.printStackTrace();
     46                 }
     47             }
     48         }
     49     }
     50     
     51     /**
     52      * 压缩成ZIP 方法2
     53      * @param srcFiles 需要压缩的文件列表
     54      * @param out           压缩文件输出流
     55      * @throws RuntimeException 压缩失败会抛出运行时异常
     56      */
     57     public static void toZip(List<File> srcFiles , OutputStream out)throws RuntimeException {
     58         long start = System.currentTimeMillis();
     59         ZipOutputStream zos = null ;
     60         try {
     61             zos = new ZipOutputStream(out);
     62             for (File srcFile : srcFiles) {
     63                 byte[] buf = new byte[BUFFER_SIZE];
     64                 zos.putNextEntry(new ZipEntry(srcFile.getName()));
     65                 int len;
     66                 FileInputStream in = new FileInputStream(srcFile);
     67                 while ((len = in.read(buf)) != -1){
     68                     zos.write(buf, 0, len);
     69                 }
     70                 zos.closeEntry();
     71                 in.close();
     72             }
     73             long end = System.currentTimeMillis();
     74             System.out.println("压缩完成,耗时:" + (end - start) +" ms");
     75         } catch (Exception e) {
     76             throw new RuntimeException("zip error from ZipAction",e);
     77         }finally{
     78             if(zos != null){
     79                 try {
     80                     zos.close();
     81                 } catch (IOException e) {
     82                     e.printStackTrace();
     83                 }
     84             }
     85         }
     86     }
     87     /**
     88      * 递归压缩方法
     89      * @param sourceFile 源文件
     90      * @param zos        zip输出流
     91      * @param name       压缩后的名称
     92      * @param KeepDirStructure  是否保留原来的目录结构,true:保留目录结构;  
     93      *                          false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)
     94      * @throws Exception
     95      */
     96     private static void compress(File sourceFile, ZipOutputStream zos, String name,
     97             boolean KeepDirStructure) throws Exception{
     98         byte[] buf = new byte[BUFFER_SIZE];
     99         if(sourceFile.isFile()){
    100             // 向zip输出流中添加一个zip实体,构造器中name为zip实体的文件的名字
    101             zos.putNextEntry(new ZipEntry(name));
    102             // copy文件到zip输出流中
    103             int len;
    104             FileInputStream in = new FileInputStream(sourceFile);
    105             while ((len = in.read(buf)) != -1){
    106                 zos.write(buf, 0, len);
    107             }
    108             // Complete the entry
    109             zos.closeEntry();
    110             in.close();
    111         } else {
    112             File[] listFiles = sourceFile.listFiles();
    113             if(listFiles == null || listFiles.length == 0){
    114                 // 需要保留原来的文件结构时,需要对空文件夹进行处理
    115                 if(KeepDirStructure){
    116                     // 空文件夹的处理
    117                     zos.putNextEntry(new ZipEntry(name + "/"));
    118                     // 没有文件,不需要文件的copy
    119                     zos.closeEntry();
    120                 }
    121             }else {
    122                 for (File file : listFiles) {
    123                     // 判断是否需要保留原来的文件结构
    124                     if (KeepDirStructure) {
    125                         // 注意:file.getName()前面需要带上父文件夹的名字加一斜杠,
    126                         // 不然最后压缩包中就不能保留原来的文件结构,即:所有文件都跑到压缩包根目录下了
    127                         compress(file, zos, name + "/" + file.getName(),KeepDirStructure);
    128                     } else {
    129                         compress(file, zos, file.getName(),KeepDirStructure);
    130                     }
    131                 }
    132             }
    133         }
    134     }
    135     public static void main(String[] args) throws Exception {
    136         /** 测试压缩方法1  */
    137         FileOutputStream fos1 = new FileOutputStream(new File("C:/Users/Jason/Desktop/log/innermanage.zip"));
    138         ZipAction.toZip("C:/Users/Jason/Desktop/log", fos1,true);
    139         /** 测试压缩方法2  */
    140         List<File> fileList = new ArrayList<>();
    141         fileList.add(new File("C:/Users/Jason/Desktop/log/innermanage/TestAction - 副本.java"));
    142         fileList.add(new File("C:/Users/Jason/Desktop/log/innermanage/TestAction.java"));
    143         FileOutputStream fos2 = new FileOutputStream(new File("C:/Users/Jason/Desktop/log/test.zip"));
    144         ZipAction.toZip(fileList, fos2);
    145     }
    146 }
  • 相关阅读:
    CF763C Timofey and Remoduling
    CF762E Radio Stations
    CF762D Maximum Path
    CF763B Timofey and Rectangles
    URAL1696 Salary for Robots
    uva10884 Persephone
    LA4273 Post Offices
    SCU3037 Painting the Balls
    poj3375 Network Connection
    Golang zip压缩文件读写操作
  • 原文地址:https://www.cnblogs.com/newwind/p/9680253.html
Copyright © 2011-2022 走看看