java 压缩单文件_java工具类——单文件、多文件、多层目录递归zip压缩

importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.OutputStream;importjava.util.ArrayList;importjava.util.List;importjava.util.zip.ZipEntry;importjava.util.zip.ZipOutputStream;/*** ZipUtils

*

*@authoronly-dream

* @date

*@version

*/

public classZipUtils {private static final int BUFFER_SIZE = 2 * 1024;/*** 压缩成ZIP 单文件压缩

*

*@paramsrcDir

* 压缩文件夹路径

*@paramout

* 压缩文件输出流

*@paramKeepDirStructure

* 是否保留原来的目录结构,true:保留目录结构;

* false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)

*@throwsRuntimeException

* 压缩失败会抛出运行时异常 存在问题当源文件找不到的时候仍然压缩,*/

public static void toZip(String srcDir, OutputStream out, boolean KeepDirStructure) throwsRuntimeException {long start =System.currentTimeMillis();

ZipOutputStream zos= null;try{

zos= newZipOutputStream(out);

File sourceFile= newFile(srcDir);

compress(sourceFile, zos, sourceFile.getName(), KeepDirStructure);long end =System.currentTimeMillis();

System.out.println("压缩完成,耗时:" + (end - start) + " ms");

}catch(Exception e) {throw new RuntimeException("zip error from ZipUtils", e);

}finally{if (zos != null) {try{

zos.close();

}catch(IOException e) {

e.printStackTrace();

}

}

}

}/*** 压缩成ZIP 多文件压缩

*

*@paramsrcFiles

* 需要压缩的文件列表

*@paramout

* 压缩文件输出流

*@throwsRuntimeException

* 压缩失败会抛出运行时异常 提前判断文件是否存在*/

public static void toZip(List srcFiles, OutputStream out) throwsRuntimeException {long start =System.currentTimeMillis();

ZipOutputStream zos= null;try{

zos= newZipOutputStream(out);for(File srcFile : srcFiles) {byte[] buf = new byte[BUFFER_SIZE];

zos.putNextEntry(newZipEntry(srcFile.getName()));intlen;

FileInputStream in= newFileInputStream(srcFile);while ((len = in.read(buf)) != -1) {

zos.write(buf,0, len);

}

zos.closeEntry();

in.close();

}long end =System.currentTimeMillis();

System.out.println("压缩完成,耗时:" + (end - start) + " ms");

}catch(Exception e) {throw new RuntimeException("zip error from ZipUtils", e);

}finally{if (zos != null) {try{

zos.close();

}catch(IOException e) {

e.printStackTrace();

}

}

}

}/*** 递归压缩方法

*

*@paramsourceFile

* 源文件

*@paramzos

* zip输出流

*@paramname

* 压缩后的名称

*@paramKeepDirStructure

* 是否保留原来的目录结构,true:保留目录结构;

* false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)

*@throwsException*/

private static void compress(File sourceFile, ZipOutputStream zos, String name, booleanKeepDirStructure)throwsException {byte[] buf = new byte[BUFFER_SIZE];if(sourceFile.isFile()) {//向zip输出流中添加一个zip实体,构造器中name为zip实体的文件的名字

zos.putNextEntry(newZipEntry(name));//copy文件到zip输出流中

intlen;

FileInputStream in= newFileInputStream(sourceFile);while ((len = in.read(buf)) != -1) {

zos.write(buf,0, len);

}//Complete the entry

zos.closeEntry();

in.close();

}else{

File[] listFiles= sourceFile.listFiles();//listFiles是获取该目录下所有文件和目录的绝对路径

if (listFiles == null || listFiles.length == 0) {//需要保留原来的文件结构时,需要对空文件夹进行处理

if(KeepDirStructure) {//空文件夹的处理

zos.putNextEntry(new ZipEntry(name + "/"));//没有文件,不需要文件的copy

zos.closeEntry();//关闭当前zip条目读取下一条

}

}else{for(File file : listFiles) {//判断是否需要保留原来的文件结构

if(KeepDirStructure) {//注意:file.getName()前面需要带上父文件夹的名字加一斜杠,//不然最后压缩包中就不能保留原来的文件结构,即:所有文件都跑到压缩包根目录下了

compress(file, zos, name + "/" +file.getName(), KeepDirStructure);

}else{

compress(file, zos, file.getName(), KeepDirStructure);

}

}

}

}

}/***

*@paramsrc 被压缩的文件源路径

*@paramnewSrc 压缩后的新路径+名称

*@paramzipName 压缩后内层文件的名称

*@paramKeepDirStructure

* 是否保留原来的目录结构,true:保留目录结构;

* false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)

*@throwsException*/

public static void batchCompress(String src,String newSrc,String zipName,boolean KeepDirStructure) throwsException{

FileOutputStream fos3= new FileOutputStream(newFile(newSrc));

File file= newFile(src);

ZipOutputStream zos= newZipOutputStream(fos3);

ZipUtils.compress(file, zos, zipName, KeepDirStructure);

zos.close();//切记关闭资源否则zip包出错

}public static void main(String[] args) throwsException {/**测试压缩方法1*/

/** FileOutputStream fos1 = new FileOutputStream(new

* File("F:/mytest01.zip")); ZipUtils.toZip(

* "F:/photo/鸡哈线/质量管理/过程质量控制/钢筋工程/fds/3D120-2018-11-14-001X号塔+桩号(承台)+钢筋工程.jpeg",

* fos1,true);*/

/**测试压缩方法2*/List fileList = new ArrayList();

fileList.add(new File("F:/笔记/截图/Html/合并单元格.png"));

fileList.add(new File("F:/photo/鸡哈线/质量管理/过程质量控制/钢筋工程/fds/3D120-2018-11-14-001X号塔+桩号(承台)+钢筋工程.jpeg")); FileOutputStream fos2 = new FileOutputStream(newFile("F:/mytest02.zip")); ZipUtils.toZip(fileList, fos2);/**测试递归压缩 必须关闭zip流*/

/*FileOutputStream fos3 = new FileOutputStream(new File("F:/mytest03.zip"));

File file = new File("F:/photo/鸡哈线");

ZipOutputStream zos = new ZipOutputStream(fos3);

ZipUtils.compress(file, zos, "鸡哈线", true);

zos.close();//这里必须切记关闭*/}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值