做签证宾馆订单用啥网站,淘宝网站建设教程视频,微信公众帐号平台官网,网站专业制作公司Java实现将文件或者文件夹压缩成zip 最近碰到个需要下载zip压缩包的需求#xff0c;于是我在网上找了下别人写好的zip工具类。但找了好多篇博客#xff0c;总是发现有bug。因此就自己来写了个工具类。 这个工具类的功能为#xff1a; #xff08;1#xff09;可以压缩文件…Java实现将文件或者文件夹压缩成zip 最近碰到个需要下载zip压缩包的需求于是我在网上找了下别人写好的zip工具类。但找了好多篇博客总是发现有bug。因此就自己来写了个工具类。 这个工具类的功能为 1可以压缩文件也可以压缩文件夹2同时支持压缩多级文件夹工具内部做了递归处理3碰到空的文件夹也可以压缩4可以选择是否保留原来的目录结构如果不保留所有文件跑压缩包根目录去了且空文件夹直接舍弃。注意如果不保留文件原来目录结构在碰到文件名相同的文件时会压缩失败。5代码中提供了2个压缩文件的方法一个的输入参数为文件夹路径一个为文件列表可根据实际需求选择方法。下面直接上代码
package com.ibm.scm.purchase.utils;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import java.util.ArrayList;import java.util.List;
import java.util.zip.ZipEntry;import java.util.zip.ZipOutputStream;
public class ZipUtils {private static final int BUFFER_SIZE 2 * 1024;/*** 压缩成ZIP 方法1* param srcDir 压缩文件夹路径 * param out 压缩文件输出流* param KeepDirStructure 是否保留原来的目录结构,true:保留目录结构; * false:所有文件跑到压缩包根目录下(注意不保留目录结构可能会出现同名文件,会压缩失败)* throws RuntimeException 压缩失败会抛出运行时异常*/public static void toZip(String srcDir, OutputStream out, boolean KeepDirStructure)throws RuntimeException{long start System.currentTimeMillis();ZipOutputStream zos null ;try {zos new ZipOutputStream(out);File sourceFile new File(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 方法2* param srcFiles 需要压缩的文件列表* param out 压缩文件输出流* throws RuntimeException 压缩失败会抛出运行时异常*/public static void toZip(ListFile srcFiles , OutputStream out)throws RuntimeException {long start System.currentTimeMillis();ZipOutputStream zos null ;try {zos new ZipOutputStream(out);for (File srcFile : srcFiles) {byte[] buf new byte[BUFFER_SIZE];zos.putNextEntry(new ZipEntry(srcFile.getName()));int len;FileInputStream in new FileInputStream(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();}}}}/*** 递归压缩方法* param sourceFile 源文件* param zos zip输出流* param name 压缩后的名称* param KeepDirStructure 是否保留原来的目录结构,true:保留目录结构; * false:所有文件跑到压缩包根目录下(注意不保留目录结构可能会出现同名文件,会压缩失败)* throws Exception*/private static void compress(File sourceFile, ZipOutputStream zos, String name,boolean KeepDirStructure) throws Exception{byte[] buf new byte[BUFFER_SIZE];if(sourceFile.isFile()){// 向zip输出流中添加一个zip实体构造器中name为zip实体的文件的名字zos.putNextEntry(new ZipEntry(name));// copy文件到zip输出流中int len;FileInputStream in new FileInputStream(sourceFile);while ((len in.read(buf)) ! -1){zos.write(buf, 0, len);}// Complete the entryzos.closeEntry();in.close();} else {File[] listFiles sourceFile.listFiles();if(listFiles null || listFiles.length 0){// 需要保留原来的文件结构时,需要对空文件夹进行处理if(KeepDirStructure){// 空文件夹的处理zos.putNextEntry(new ZipEntry(name /));// 没有文件不需要文件的copyzos.closeEntry();}}else {for (File file : listFiles) {// 判断是否需要保留原来的文件结构if (KeepDirStructure) {// 注意file.getName()前面需要带上父文件夹的名字加一斜杠,// 不然最后压缩包中就不能保留原来的文件结构,即所有文件都跑到压缩包根目录下了compress(file, zos, name / file.getName(),KeepDirStructure);} else {compress(file, zos, file.getName(),KeepDirStructure);}}}}}public static void main(String[] args) throws Exception {/** 测试压缩方法1 */FileOutputStream fos1 new FileOutputStream(new File(c:/mytest01.zip));ZipUtils.toZip(D:/log, fos1,true);/** 测试压缩方法2 */ListFile fileList new ArrayListFile();fileList.add(new File(D:/Java/jdk1.7.0_45_64bit/bin/jar.exe));fileList.add(new File(D:/Java/jdk1.7.0_45_64bit/bin/java.exe));FileOutputStream fos2 new FileOutputStream(new File(c:/mytest02.zip));ZipUtils.toZip(fileList, fos2);}}
二、注意事项 写该工具类时有些注意事项说一下 1支持选择是否保留原来的文件目录结构如果不保留那么空文件夹直接不用处理。 1碰到空文件夹时如果需要保留目录结构则直接添加个ZipEntry就可以了不过就是这个entry的名字后面需要带上一斜杠/表示这个是目录。 2递归时不需要把zip输出流关闭zip输出流的关闭应该是在调用完递归方法后面关闭 3递归时如果是个文件夹且需要保留目录结构那么在调用方法压缩他的子文件时需要把文件夹的名字加一斜杠给添加到子文件名字前面这样压缩后才有多级目录。