Java实现将文件或者文件夹压缩成zip

news/2024/10/19 21:31:38/

这个工具类的功能为:
1 . 可以压缩文件,也可以压缩文件夹
2. 同时支持压缩多级文件夹,工具内部做了递归处理
3. 碰到空的文件夹,也可以压缩
4. 可以选择是否保留原来的目录结构,如果不保留,所有文件跑压缩包根目录去了,且空文件夹直接舍弃。注意:如果不保留文件原来目录结构,在碰到文件名相同的文件时,会压缩失败。
5. 代码中提供了2个压缩文件的方法,一个的输入参数为文件夹路径,一个为文件列表,可根据实际需求选择方法。

package com.tax.core.util; 
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(List<File> 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  */List<File> fileList = new ArrayList<>();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);}
}

http://www.ppmy.cn/news/785889.html

相关文章

Java实现将文件夹下的文件压缩成压缩包,复制文件(文件夹)到指定目录

Java将文件压缩成压缩包 关于java下载文件的时候, 多是把很多文件压缩成压缩包之后在下载, 之前在网上查了一些资料, 将文件压缩成压缩包, 里面还有复制文件或文件夹的方法&#xff0c;最近又使用到这个, 所以记录一下, 方便后续可能再次使用到。 代码片. import java.io.*;…

使用python进行文件夹的压缩

可以使用自带的库 shutil / zipfile 以下使用 shutil下的make_archive方法 make_archive(目标文件路径,压缩文件后缀,需要压缩的目录) 压缩后缀支持以下几种格式&#xff1a; 压缩后缀 实际压缩 zip zip tar tar gztar tar.gz bzta…

aix 文件夹压缩

aix 文件夹压缩 1、打包文件夹 $ tar -cvf 文件夹.tar 文件夹 2、压缩 $ gzip 文件夹.tar aix 文件夹解压 1、解压文件 $ gunzip 文件夹.tar.gz 2、恢复文件夹 $ tar -xvf 文件夹.tar 如果文件较多且文件总量上百G&#xff0c;tar打包时间会很长&#xff0c;可以先压缩文件…

qt压缩解压文件夹

首先写这篇文章的初衷&#xff0c;整个网络上只要搜QT的QZipWriter和QZipReader解压缩&#xff0c;几乎都是有问题的&#xff0c;都是只针对一个文件的解压缩&#xff0c;但实际情况下&#xff0c;我们一般都是对文件夹进行解压缩&#xff0c;在搜不到Qt本身压缩工具的使用方法…

jupyter notebook 压缩/解压文件夹

转载请注明出处&#xff01;&#xff01;&#xff01; 压缩 压缩成zip格式 # 压缩当前路径所有文件&#xff0c;输出zip文件 path./import zipfile,os zipName student_id.zip #压缩后文件的位置及名称 f zipfile.ZipFile( zipName, w, zipfile.ZIP_DEFLATED ) for dirpat…

把linux文件夹压缩成tar.gz的命令

解压 tar zxvf 文件名.tar.gz 压缩 tar zcvf 文件名.tar.gz 目标名

java实现文件夹压缩

java实现包含文件的文件夹ZIP压缩&#xff0c;总结如下&#xff1a; 解决中文乱码的问题&#xff0c;ZipOutputStream用org.apache.tools.zip.&#xff08;而不是用java.util.zip.&#xff09;&#xff0c;指定编码为GBK&#xff1b;ZipEntry的setTime(long long)方法可以设置…

计算机限制无法压缩,电脑上文件夹压缩不了怎么办

1. 我的电脑怎么不能压缩文件了 电脑不能压缩文件的原因可能是电脑系统出错导致的&#xff0c;重新进行压缩即可&#xff0c;具体方法步骤如下&#xff1a; 1、首先打开自己的文件夹或者文档&#xff0c;选择需要压缩的文件。 2、选中文件夹&#xff0c;右击选择压缩到“当前文…