最近碰到个需要下载压缩压缩包的需求,于是我在网上找了下别人写好的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