java 实现压缩zip的几种方案
生活随笔
收集整理的這篇文章主要介紹了
java 实现压缩zip的几种方案
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
需求,將指定目錄下的文件及文件夾壓縮成一個指定賠案號為名稱,以".zip"結(jié)尾的壓縮包提供客戶下載。
package com.gblfy.util;import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.zip.CRC32; import java.util.zip.CheckedOutputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream;/*** java實現(xiàn)zip壓縮文件(同一文件夾下的多個文件夾打成一個zip包)** @author gblfy* @date 2020-07-02*/ public class ZipCompressorUtil {static final int BUFFER = 8192;private File zipFile;public ZipCompressorUtil(String pathName) {zipFile = new File(pathName);}/*** 壓縮指定文件或者文件夾* <p>* 壓縮文件夾,壓縮包中包含自己本身這一級文件夾* 例如:* 壓縮后的zip包名: a.zip* 壓縮目錄: D:\1\* 壓縮完成后:a.zip 包中包含1這一級文件夾* </p>** @param pathName 傳入一個或者多個文件/文件夾的絕對路徑 可變參數(shù)*/public void compressContainShell(String... pathName) {ZipOutputStream out = null;try {FileOutputStream fileOutputStream = new FileOutputStream(zipFile);CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream,new CRC32());out = new ZipOutputStream(cos);String basedir = "";for (int i = 0; i < pathName.length; i++) {//循環(huán)遍歷傳入的文件或者文件夾的絕對路徑的 可變參數(shù)compress(new File(pathName[i]), out, basedir);}out.close();} catch (Exception e) {throw new RuntimeException(e);}}/*** 壓縮指定文件或者文件夾** @param files*/public void compressContainShell(File[] files) {ZipOutputStream out = null;try {FileOutputStream fileOutputStream = new FileOutputStream(zipFile);CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream,new CRC32());out = new ZipOutputStream(cos);String basedir = "";for (int i = 0; i < files.length; i++) {//循環(huán)遍歷傳入的文件或者文件夾的絕對路徑的 可變參數(shù)compress(files[i], out, basedir);}out.close();} catch (Exception e) {throw new RuntimeException(e);}}/*** /*** 壓縮指定文件或者文件夾* <p>* 壓縮文件夾,壓縮包中包含自己本身這一級文件夾* 例如:* 壓縮后的zip包名: a.zip* 壓縮目錄: D:\1\* 壓縮完成后:a.zip 包中不包含1這一級文件夾* </p>** @param srcPathNameOrFileName*/public void compressNotContainShell(String srcPathNameOrFileName) {ZipOutputStream out = null;try {FileOutputStream fileOutputStream = new FileOutputStream(zipFile);CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream,new CRC32());out = new ZipOutputStream(cos);String basedir = "";//循環(huán)遍歷傳入的文件或者文件夾的絕對路徑的 可變參數(shù)File dir = new File(srcPathNameOrFileName);if (!dir.exists()) {System.out.println("壓縮目錄不存在,請核實!");return;}File[] files = dir.listFiles();for (int i = 0; i < files.length; i++) {compress(new File(String.valueOf(files[i])), out, basedir);}out.close();} catch (Exception e) {throw new RuntimeException(e);}}/*** 判斷傳參類型:是目錄還是文件* <p>* 1.如果是文件,則調(diào)用壓縮文件方法* 2.如果是目錄,則調(diào)用壓縮目錄方法* </p>** @param file* @param out* @param basedir*/private void compress(File file, ZipOutputStream out, String basedir) {if (file.isDirectory()) {System.out.println("壓縮:" + basedir + file.getName());//調(diào)用壓縮目錄方法this.compressDirectory(file, out, basedir);} else {System.out.println("壓縮:" + basedir + file.getName());//調(diào)用壓縮文件方法this.compressFile(file, out, basedir);}}/*** 壓縮一個目錄** @param dir 目錄* @param out zip輸出流* @param basedir 基礎(chǔ)路徑前綴 例如: 第一層 “” 第二層 /*/private void compressDirectory(File dir, ZipOutputStream out, String basedir) {if (!dir.exists()) {System.out.println("壓縮目錄不存在,請核實!");return;}File[] files = dir.listFiles();for (int i = 0; i < files.length; i++) {/* 遞歸 */compress(files[i], out, basedir + dir.getName() + "/");}}/***壓縮一個文件** @param file 文件* @param out zip輸出流* @param basedir 基礎(chǔ)路徑前綴 例如: 第一層 “” 第二層 /*/private void compressFile(File file, ZipOutputStream out, String basedir) {if (!file.exists()) {System.out.println("壓縮文件不存在,請核實!");return;}try {BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));ZipEntry entry = new ZipEntry(basedir + file.getName());out.putNextEntry(entry);int count;byte data[] = new byte[BUFFER];while ((count = bis.read(data, 0, BUFFER)) != -1) {out.write(data, 0, count);}bis.close();} catch (Exception e) {throw new RuntimeException(e);}}/*** 壓縮指定文件或者文件夾* <p>* 壓縮文件夾,壓縮包中包含自己本身這一級文件夾* 例如:* 壓縮后的zip包名: a.zip* 壓縮目錄: D:\1\* 壓縮完成后:a.zip 包中包含1這一級文件夾* </p>** @param srcPathNameOrFileName*/public void compressContainShell(String srcPathNameOrFileName) {File file = new File(srcPathNameOrFileName);if (!file.exists()) {throw new RuntimeException(srcPathNameOrFileName + "不存在!");}try {FileOutputStream fileOutputStream = new FileOutputStream(zipFile);CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream,new CRC32());ZipOutputStream out = new ZipOutputStream(cos);String basedir = "";compress(file, out, basedir);out.close();} catch (Exception e) {throw new RuntimeException(e);}}//--------------------------------------------單元測試--------------------------------------------public static void main(String[] args) {ZipCompressorUtil zc = new ZipCompressorUtil("D:/resource.zip");String b = "D:\\1\\";// // String b = "D:\\1.jpg";zc.compressNotContainShell(b);// zc.compress("D:\\1.jpg", "D:\\3.jpeg", "D:\\4.jpg", b);} }企業(yè)內(nèi)部線上:補充方案
package com.gblfy.test;import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.zip.CRC32; import java.util.zip.CheckedOutputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream;/*** java實現(xiàn)zip壓縮文件(同一文件夾下的多個文件夾打成一個zip包)** @author gblfy* @date 2020-07-02*/ public class ZipCompressorUtil2 {static final int BUFFER = 8192;/*** 判斷傳參類型:是目錄還是文件* <p>* 1.如果是文件,則調(diào)用壓縮文件方法* 2.如果是目錄,則調(diào)用壓縮目錄方法* </p>** @param file* @param out* @param basedir*/private void compress(File file, ZipOutputStream out, String basedir) {if (file.isDirectory()) {System.out.println("壓縮:" + basedir + file.getName());//調(diào)用壓縮目錄方法this.compressDirectory(file, out, basedir);} else {System.out.println("壓縮:" + basedir + file.getName());//調(diào)用壓縮文件方法this.compressFile(file, out, basedir);}}/*** 壓縮一個目錄** @param dir 目錄* @param out zip輸出流* @param basedir 基礎(chǔ)路徑前綴 例如: 第一層 “” 第二層 /*/private void compressDirectory(File dir, ZipOutputStream out, String basedir) {if (!dir.exists()) {System.out.println("壓縮目錄不存在,請核實!");return;}File[] files = dir.listFiles();for (int i = 0; i < files.length; i++) {/* 遞歸 */compress(files[i], out, basedir + dir.getName() + "/");}}/*** 壓縮一個文件** @param file 文件* @param out zip輸出流* @param basedir 基礎(chǔ)路徑前綴 例如: 第一層 “” 第二層 /*/private void compressFile(File file, ZipOutputStream out, String basedir) {if (!file.exists()) {System.out.println("壓縮文件不存在,請核實!");return;}try {BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));ZipEntry entry = new ZipEntry(basedir + file.getName());out.putNextEntry(entry);int count;byte data[] = new byte[BUFFER];while ((count = bis.read(data, 0, BUFFER)) != -1) {out.write(data, 0, count);}bis.close();} catch (Exception e) {throw new RuntimeException(e);}}/*** /*** 壓縮指定文件或者文件夾* <p>* 壓縮文件夾,壓縮包中包含自己本身這一級文件夾* 例如:* 壓縮后的zip包名: a.zip* 壓縮目錄: D:\1\* 壓縮完成后:a.zip 包中不包含1這一級文件夾* </p>** @param srcPathNameOrFileName*/public void compressNotContainShell(String srcPathNameOrFileName, String zipFilePath) {ZipOutputStream out = null;try {File zipFile = getZipName(zipFilePath);FileOutputStream fileOutputStream = new FileOutputStream(zipFile);CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream,new CRC32());out = new ZipOutputStream(cos);String basedir = "";//循環(huán)遍歷傳入的文件或者文件夾的絕對路徑的 可變參數(shù)File dir = new File(srcPathNameOrFileName);if (!dir.exists()) {System.out.println("壓縮目錄不存在,請核實!");return;}File[] files = dir.listFiles();for (int i = 0; i < files.length; i++) {compress(new File(String.valueOf(files[i])), out, basedir);}out.close();} catch (Exception e) {throw new RuntimeException(e);}}/*** 以* @param pathName* @return*/public File getZipName(String pathName) {return new File(pathName);}//--------------------------------------------單元測試--------------------------------------------public static void main(String[] args) {ZipCompressorUtil2 zc = new ZipCompressorUtil2();String docPath = "D:\\22\\srcImgPath\\理賠報名類單證\\";String zipFileName = "D:\\22\\srcImgPath\\123.zip";zc.compressNotContainShell(docPath, zipFileName);// zc.compress("D:\\1.jpg", "D:\\3.jpeg", "D:\\4.jpg", b);} }總結(jié)
以上是生活随笔為你收集整理的java 实现压缩zip的几种方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决linux下创建用户时出现Creat
- 下一篇: 开源考试系统 - 本地代码调试运行