如何将文件夹压缩为zip格式

news/2024/11/16 12:58:14/

需求:需要压缩一个文件夹,文件夹下有不同文件,其中有一部分不需要压缩。

方法一:目录格式按照之前文件夹格式压缩

package cn.com.vsai.knowledge.graphlabel.service;import java.io.*;
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* @param srcDir 压缩文件夹路径* @param out    压缩文件输出流* @param KeepDirStructure  是否保留原来的目录结构,true:保留目录结构;* 							false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)* @throws RuntimeException 压缩失败会抛出运行时异常*/public static void toZip(String srcDir, OutputStream out, boolean KeepDirStructure, List<String> filesBreakList)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,filesBreakList);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, List<String> filesBreakList) 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()前面需要带上父文件夹的名字加一斜杠,// 不然最后压缩包中就不能保留原来的文件结构,即:所有文件都跑到压缩包根目录下了boolean have=false;for (String str:filesBreakList){if (str.equals(file.getName())){have=true;break;}}if(!have){compress(file, zos, name + "/" + file.getName(), KeepDirStructure,filesBreakList);}} else {compress(file, zos, file.getName(),KeepDirStructure,filesBreakList);}}}}}public static void main(String[] args) throws Exception {/** 测试压缩方法  */FileOutputStream fos1 = new FileOutputStream(new File("C:\\Users\\DELL\\Desktop\\1.zip"));List<String> filesBreakList = new ArrayList<>() ;filesBreakList.add("3.1");filesBreakList.add("3.2");System.out.println(filesBreakList);ZipUtils.toZip("C:\\Users\\DELL\\Desktop\\1", fos1,true,filesBreakList);}}

方法二:所有文件压缩到根目录

package cn.com.vsai.knowledge.graphlabel.service;import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;public class ZipUtil {private static final int  BUFFER_SIZE = 2 * 1024;/*** 压缩成ZIP* @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();}}}}public static void main(String[] args) throws Exception {/** 测试压缩方法  */List<File> fileList = new ArrayList<>();fileList.add(new File("C:\\Users\\DELL\\Desktop\\1\\1.1\\1.txt"));fileList.add(new File("C:\\Users\\DELL\\Desktop\\1\\2\\2.txt"));fileList.add(new File("C:\\Users\\DELL\\Desktop\\1\\3\\3.1\\3.txt"));FileOutputStream fos2 = new FileOutputStream(new File("C:/Users/DELL/Desktop/6.zip"));ZipUtil.toZip(fileList, fos2);}}


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

相关文章

tar 压缩文件夹到指定的目录

tar -cvzf /dev/tmp/erp_exp.tar.gz /tools/erp_exp /dev/tmp/erp_exp.tar.gz 为指定目录的压缩文件 /tools/erp_exp 为要压缩的文件夹

Java 压缩文件夹

本文只针对压缩文件夹(不用于压缩文件&#xff0c;若需要&#xff0c;自行更改) public class ZipTool {File f0; //被压缩的目标File f1; //压缩后的目录及文件名public ZipTool(File f0, File f1) {this.f0 f0;this.f1 f1;start();}public void start() {try (ZipOutput…

Python —— 压缩文件夹

Python —— 压缩文件夹 目标&#xff1a;压缩指定文件夹为zip文件 适用场景&#xff1a;批处理文件&#xff0c;定时打包并发送至指定用户邮箱 python脚本如下&#xff1a; #!/usr/bin/env python # -*- coding:utf-8 -*-""" Author :xxxxx Contact :122…

Java压缩文件/文件夹

ZipOutputStream流、递归压缩。 在关闭ZipOutputStream流之前&#xff0c;需要先调用flush()方法&#xff0c;强制将缓冲区所有的数据输出&#xff0c;以避免解压文件时出现压缩文件已损坏的现象。 /*** param source 待压缩文件/文件夹路径* param destination 压缩后压…

Linux下压缩文件夹命令

tar -zcvf 打包后生成的文件名全路径 要打包的目录 例子&#xff1a;把/xahot文件夹打包后生成一个/home/xahot.tar.gz的文件。 tar -zcvf /home/xahot.tar.gz /xahot zip 压缩方法&#xff1a; 压缩当前的文件夹 zip -r ./xahot.zip ./* -r表示递归 zip [参数] [打包后的文…

tar压缩和解压文件或文件夹

1. 使用tar压缩文件 tar -zcvf test.tar.gz ./test/ 该命令表示压缩当前文件夹下的文件夹test&#xff0c;压缩后缀名为test.tar.gz 如果不需要压缩成gz&#xff0c;只需要后缀为tar格式的&#xff0c;那么输入如下命令&#xff1a; tar -cvf test.tar ./test/ 2. 使用tar解…

Linux下压缩文件夹

tar -zcvf /home/xahot.tar.gz /xahot tar -zcvf 打包后生成的文件名全路径 要打包的目录 例子&#xff1a;把/xahot文件夹打包后生成一个/home/xahot.tar.gz的文件。 zip 压缩方法&#xff1a; 压缩当前的文件夹 zip -r ./xahot.zip ./* -r表示递归 zip [参数] [打包后的文件…

MYSQL中的utf8mb4(Unicode Transformation Format 8-bit MultiByte 4-byte)

Simply put In MySQL, the UTF8MB4 character set is an extension of the UTF8 character set. It allows you to store and handle a wider range of Unicode characters, including emojis and characters from various scripts and languages. The “UTF8MB4” name itse…