Java实现把文件及文件夹压缩成zip

  

最近碰到个需要下载压缩压缩包的需求,于是我在网上找了下别人写好的zip工具类。但找了好多篇博客,总是发现有bug。因此就自己来写了个工具类。
  这个工具类的功能为:
  

  

(1)可以压缩文件,也可以压缩文件夹
  

  

(2)同时支持压缩多级文件夹,工具内部做了递归处理
  

  

(3)碰到空的文件夹,也可以压缩
  

  

(4)可以选择是否保留原来的目录结构,如果不保留,所有文件跑压缩包根目录去了,且空文件夹直接舍弃。注意:如果不保留文件原来目录结构,在碰到文件名相同的文件时,会压缩失败。
  

  

(5)代码中提供了2个压缩文件的方法,一个的输入参数为文件夹路径,一个为文件列表,可根据实际需求选择方法。
  

  

下面直接上代码
  

  

<强>一、代码

  

ZipUtils         进口java.io.File;   进口java.io.FileInputStream;   进口java.io.FileOutputStream;   进口java.io.IOException;   进口java.io.OutputStream;   进口java.util.ArrayList;   进口并不知道;   进口java.util.zip.ZipEntry;   进口java.util.zip.ZipOutputStream;/* *   * @author尼莫   * @version 1.0   * @date 2019/11/5   */公开课ZipUtils {   私有静态最终int BUFFER_SIZE=2 * 1024;/* *   *压缩成ZIP方法1   * @param源文件压缩文件夹路径   * @param出压缩文件输出流   * @param KeepDirStructure是否保留原来的目录结构,真的:保留目录结构;   *假:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)   * @throws RuntimeException压缩失败会抛出运行时异常   */公共静态孔隙toZip(文件源文件,OutputStream,布尔KeepDirStructure)   抛出RuntimeException {   ZipOutputStream环球=零;   尝试{   环球=new ZipOutputStream(出);   压缩(源文件、环球sourceFile.getName (), KeepDirStructure);   }捕捉(异常e) {   把新RuntimeException (“zip从ZipUtils错误”,e);   最后}{   如果(环球!=null) {   尝试{   zos.close ();   }捕捉(IOException e) {   e.printStackTrace ();   }   }   }   }/* *   *压缩成ZIP方法2   * @param srcFiles需要压缩的文件列表   * @param出压缩文件输出流   * @throws RuntimeException压缩失败会抛出运行时异常   */公共静态孔隙toZip (ListsrcFiles, OutputStream)抛出RuntimeException {   长开始=System.currentTimeMillis ();   ZipOutputStream环球=零;   尝试{   环球=new ZipOutputStream(出);   (文件srcFile: srcFiles) {   byte [] buf=新字节(BUFFER_SIZE);   环球。putNextEntry(新ZipEntry (srcFile.getName ()));   int len;   FileInputStream=新FileInputStream (srcFile);   在((len=in.read (buf) !=1) {   环球。写(buf 0 len);   }   zos.closeEntry ();   in.close ();   }   长债=System.currentTimeMillis ();   system . out。println(“压缩完成,耗时:”+(结束-开始)+“女士”);   }捕捉(异常e) {   把新RuntimeException (“zip从ZipUtils错误”,e);   最后}{   如果(环球!=null) {   尝试{   zos.close ();   }捕捉(IOException e) {   e.printStackTrace ();   }   }   }   }/* *   *递归压缩方法   * @param源文件源文件   * @param环球zip输出流   * @param名字压缩后的名称   * @param KeepDirStructure是否保留原来的目录结构,真的:保留目录结构;   *假:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)   * @throws例外   */私有静态孔隙压缩(文件的源文件,ZipOutputStream环球,字符串名称,   布尔KeepDirStructure)抛出异常{   byte [] buf=新字节(BUFFER_SIZE);   如果(sourceFile.isFile ()) {//向邮政输出流中添加一个zip实体,构造器中名称为zip实体的文件的名字   环球。putNextEntry(新ZipEntry(名称));//复制文件到zip输出流中   int len;   FileInputStream=新FileInputStream(源文件);   在((len=in.read (buf) !=1) {   环球。写(buf 0 len);   }//完成条目   zos.closeEntry ();   in.close ();   其他}{   文件[]listFiles=sourceFile.listFiles ();   如果(listFiles==null | | listFiles。长度==0){//需要保留原来的文件结构时,需要对空文件夹进行处理   如果(KeepDirStructure) {//空文件夹的处理   环球。putNextEntry(新ZipEntry(名字+ "));//没有文件,不需要文件的副本   zos.closeEntry ();   }   其他}{   (文件文件:listFiles) {//判断是否需要保留原来的文件结构   如果(KeepDirStructure) {//注意:file.getName()前面需要带上父文件夹的名字加一斜杠,//不然最后压缩包中就不能保留原来的文件结构,即:所有文件都跑到压缩包根目录下了   压缩(文件、环球名称+ " + file.getName (), KeepDirStructure);   其他}{   (压缩文件、环球file.getName (), KeepDirStructure);   }   }   }   }   }   公共静态void main (String [] args){抛出异常/* *测试压缩方法1 */FileOutputStream fos1=new FileOutputStream(新文件(“c:/mytest01.zip”));   ZipUtils。toZip(新文件(“D:/日志”),fos1, true);/* *测试压缩方法2 */List

Java实现把文件及文件夹压缩成zip