经常服务器需要对文件进行压缩,网络上流传较多的是从磁盘文件中来压缩成zip文件。但是常常服务器的文件存放在内存中,以byte[]形式存储在内存中。这个时候就不能使用网络上流传的常用方法了,这里就需要对内存文件进行压缩。通过内存文件来压缩成zip的方式,首先性能方面比磁盘压缩要快很多,另外内存文件压缩到方式不会产生临时文件或者磁盘文件,而磁盘读取文件方式压缩,会产生新的zip文件。然后要说下的是,内存压缩方式可以支持内存文件压缩,也可以手动将磁盘文件读取到内存然后在进行压缩,这样也不会产生新的临时文件。

  该工具类支持加密和非加密两种压缩方式

  以下贴上我的代码

自己扩展的内存压缩代码

ZipUtils.java
package com.cigna.hmc.groupinsurance.utils;import java.io.IOException;import org.apache.commons.lang.StringUtils;import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.io.ZipOutputStream;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.util.Zip4jConstants;/*** * @author josnow* @date 2017年5月24日 下午3:12:31* @version 1.0.0* @desc zip工具集成原CompressUtil方法,增加了对内存文件和流文件的压缩以避免产生临时文件*/
public class ZipUtils extends CompressUtil {/*** * @desc 将内存文件写入zip内。注意:最后必须调用closeZipOutputStream关闭输出流,或者手动关闭* @auth josnow* @date 2017年5月24日 下午5:23:02* @param fileName*            文件名* @param data*            文件数据* @param password*            密码*/public static void addFileToZip(String fileName, byte[] data, String password, ZipOutputStream zipOutputStream)throws ZipException, IOException {if (StringUtils.isEmpty(fileName) || data == null || data.length == 0 || zipOutputStream == null) {throw new ZipException(new StringBuilder("参数异常,fileName=").append(fileName).append(",data=").append(data).append(",zipOutputStream=").append(zipOutputStream).toString());}ZipParameters zipParameters = new ZipParameters();zipParameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE); // 压缩方式zipParameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL); // 压缩级别
zipParameters.setFileNameInZip(fileName);if (StringUtils.isNotBlank(password)) {zipParameters.setEncryptFiles(true);zipParameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);zipParameters.setPassword(password.toCharArray());}// 源文件是否为外部流,true表示使用内存文件而非本地存储文件zipParameters.setSourceExternalStream(true);zipOutputStream.putNextEntry(null, zipParameters);zipOutputStream.write(data);zipOutputStream.closeEntry();}/*** * @desc 将内存文件写入zip内。注意:最后必须调用closeZipOutputStream关闭输出流,或者手动关闭* @auth josnow* @date 2017年5月24日 下午5:46:02* @param fileName*            文件名* @param data*            文件数据*/public static void addFileToZip(String fileName, byte[] data, ZipOutputStream zipOutputStream)throws ZipException, IOException {addFileToZip(fileName, data, null, zipOutputStream);}/*** * @desc 将内存文件写入zip内。注意:最后必须调用closeZipOutputStream关闭输出流,或者手动关闭* @auth josnow* @date 2017年5月25日 上午11:08:56* @param zipParameters*            zip参数* @param data*            文件数据* @param zipOutputStream*            输出流*/public static void addFileToZip(ZipParameters zipParameters, byte[] data, ZipOutputStream zipOutputStream)throws ZipException, IOException {if (zipParameters == null || data == null || data.length == 0 || zipOutputStream == null) {throw new ZipException(new StringBuilder("参数异常,zipParameters=").append(zipParameters).append(",data=").append(data).append(",zipOutputStream=").append(zipOutputStream).toString());}zipOutputStream.putNextEntry(null, zipParameters);zipOutputStream.write(data);zipOutputStream.closeEntry();}/*** * @desc 关闭流* @auth josnow* @date 2017年5月25日 上午11:16:01* @param zipOutputStream*            输出流*/public static void closeZipOutputStream(ZipOutputStream zipOutputStream) throws IOException, ZipException {if (zipOutputStream == null) {return;}zipOutputStream.finish();zipOutputStream.close();}// public static void main(String[] args) throws Exception {// ByteArrayOutputStream byteArrayOutputStream = new// ByteArrayOutputStream(1024);// ZipOutputStream zipOutputStream = new// ZipOutputStream(byteArrayOutputStream);//// byte[] b = "德玛西亚哦哦奥法额外发撒旦;联发科就;".getBytes();//// addFileToZip("你好大猪头.txt", b, zipOutputStream);// addFileToZip("你就是大肥猪.txt", b, "123", zipOutputStream);//// closeZipOutputStream(zipOutputStream);//// byte[] zipData = byteArrayOutputStream.toByteArray();// System.out.println(new String(zipData));//// new FileOutputStream("D:\\nima.zip").write(zipData);// }

}


CompressUtil.java 网络上流传的压缩工具类

package com.cigna.hmc.groupinsurance.utils;import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;import org.apache.commons.lang.StringUtils;import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.FileHeader;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.util.Zip4jConstants;/*** ZIP压缩文件操作工具类 支持密码 依赖zip4j开源项目(http://www.lingala.net/zip4j/) 版本1.3.1* * @author ninemax*/
public class CompressUtil {/*** 使用给定密码解压指定的ZIP压缩文件到指定目录* <p>* 如果指定目录不存在,可以自动创建,不合法的路径将导致异常被抛出* * @param zip*            指定的ZIP压缩文件* @param dest*            解压目录* @param passwd*            ZIP文件的密码* @return 解压后文件数组* @throws ZipException*             压缩文件有损坏或者解压缩失败抛出*/public static File[] unzip(String zip, String dest, String passwd) throws ZipException {File zipFile = new File(zip);return unzip(zipFile, dest, passwd);}/*** 使用给定密码解压指定的ZIP压缩文件到当前目录* * @param zip*            指定的ZIP压缩文件* @param passwd*            ZIP文件的密码* @return 解压后文件数组* @throws ZipException*             压缩文件有损坏或者解压缩失败抛出*/public static File[] unzip(String zip, String passwd) throws ZipException {File zipFile = new File(zip);File parentDir = zipFile.getParentFile();return unzip(zipFile, parentDir.getAbsolutePath(), passwd);}/*** 使用给定密码解压指定的ZIP压缩文件到指定目录* <p>* 如果指定目录不存在,可以自动创建,不合法的路径将导致异常被抛出* * @param zip*            指定的ZIP压缩文件* @param dest*            解压目录* @param passwd*            ZIP文件的密码* @return 解压后文件数组* @throws ZipException*             压缩文件有损坏或者解压缩失败抛出*/public static File[] unzip(File zipFile, String dest, String passwd) throws ZipException {ZipFile zFile = new ZipFile(zipFile);zFile.setFileNameCharset("GBK");if (!zFile.isValidZipFile()) {throw new ZipException("压缩文件不合法,可能被损坏.");}File destDir = new File(dest);if (destDir.isDirectory() && !destDir.exists()) {destDir.mkdir();}if (zFile.isEncrypted()) {zFile.setPassword(passwd.toCharArray());}zFile.extractAll(dest);List<FileHeader> headerList = zFile.getFileHeaders();List<File> extractedFileList = new ArrayList<File>();for (FileHeader fileHeader : headerList) {if (!fileHeader.isDirectory()) {extractedFileList.add(new File(destDir, fileHeader.getFileName()));}}File[] extractedFiles = new File[extractedFileList.size()];extractedFileList.toArray(extractedFiles);return extractedFiles;}/*** 压缩指定文件到当前文件夹* * @param src*            要压缩的指定文件* @return 最终的压缩文件存放的绝对路径,如果为null则说明压缩失败.*/public static String zip(String src) {return zip(src, null);}/*** 使用给定密码压缩指定文件或文件夹到当前目录* * @param src*            要压缩的文件* @param passwd*            压缩使用的密码* @return 最终的压缩文件存放的绝对路径,如果为null则说明压缩失败.*/public static String zip(String src, String passwd) {return zip(src, null, passwd);}/*** 使用给定密码压缩指定文件或文件夹到当前目录* * @param src*            要压缩的文件* @param dest*            压缩文件存放路径* @param passwd*            压缩使用的密码* @return 最终的压缩文件存放的绝对路径,如果为null则说明压缩失败.*/public static String zip(String src, String dest, String passwd) {return zip(src, dest, true, passwd);}/*** 使用给定密码压缩指定文件或文件夹到指定位置.* <p>* dest可传最终压缩文件存放的绝对路径,也可以传存放目录,也可以传null或者"".<br />* 如果传null或者""则将压缩文件存放在当前目录,即跟源文件同目录,压缩文件名取源文件名,以.zip为后缀;<br />* 如果以路径分隔符(File.separator)结尾,则视为目录,压缩文件名取源文件名,以.zip为后缀,否则视为文件名.* * @param src*            要压缩的文件或文件夹路径* @param dest*            压缩文件存放路径* @param isCreateDir*            是否在压缩文件里创建目录,仅在压缩文件为目录时有效.<br />*            如果为false,将直接压缩目录下文件到压缩文件.* @param passwd*            压缩使用的密码* @return 最终的压缩文件存放的绝对路径,如果为null则说明压缩失败.*/public static String zip(String src, String dest, boolean isCreateDir, String passwd) {File srcFile = new File(src);dest = buildDestinationZipFilePath(srcFile, dest);ZipParameters parameters = new ZipParameters();parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE); // 压缩方式parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL); // 压缩级别if (!StringUtils.isEmpty(passwd)) {parameters.setEncryptFiles(true);parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD); // 加密方式
            parameters.setPassword(passwd.toCharArray());}try {ZipFile zipFile = new ZipFile(dest);if (srcFile.isDirectory()) {// 如果不创建目录的话,将直接把给定目录下的文件压缩到压缩文件,即没有目录结构if (!isCreateDir) {File[] subFiles = srcFile.listFiles();ArrayList<File> temp = new ArrayList<File>();Collections.addAll(temp, subFiles);zipFile.addFiles(temp, parameters);return dest;}zipFile.addFolder(srcFile, parameters);} else {zipFile.addFile(srcFile, parameters);}return dest;} catch (ZipException e) {e.printStackTrace();}return null;}/*** 构建压缩文件存放路径,如果不存在将会创建 传入的可能是文件名或者目录,也可能不传,此方法用以转换最终压缩文件的存放路径* * @param srcFile*            源文件* @param destParam*            压缩目标路径* @return 正确的压缩文件存放路径*/private static String buildDestinationZipFilePath(File srcFile, String destParam) {if (StringUtils.isEmpty(destParam)) {if (srcFile.isDirectory()) {destParam = srcFile.getParent() + File.separator + srcFile.getName() + ".zip";} else {String fileName = srcFile.getName().substring(0, srcFile.getName().lastIndexOf("."));destParam = srcFile.getParent() + File.separator + fileName + ".zip";}} else {createDestDirectoryIfNecessary(destParam); // 在指定路径不存在的情况下将其创建出来if (destParam.endsWith(File.separator)) {String fileName = "";if (srcFile.isDirectory()) {fileName = srcFile.getName();} else {fileName = srcFile.getName().substring(0, srcFile.getName().lastIndexOf("."));}destParam += fileName + ".zip";}}return destParam;}/*** 在必要的情况下创建压缩文件存放目录,比如指定的存放路径并没有被创建* * @param destParam*            指定的存放路径,有可能该路径并没有被创建*/private static void createDestDirectoryIfNecessary(String destParam) {File destDir = null;if (destParam.endsWith(File.separator)) {destDir = new File(destParam);} else {destDir = new File(destParam.substring(0, destParam.lastIndexOf(File.separator)));}if (!destDir.exists()) {destDir.mkdirs();}}}

转载于:https://www.cnblogs.com/wulm/p/6907197.html

java zip4j 内存文件和磁盘文件 压缩和加密相关推荐

  1. java实现将文件或图片压缩成zip包

    亲测使用实现代码地址如下:文件以及图片压缩zip并下载.zip-互联网文档类资源-CSDN下载

  2. java流与文件——内存映射文件

    [0]README 0.1) 本文描述转自 core java volume 2, 旨在理解 java流与文件--内存映射文件 的相关知识: 0.2)内存映射文件的目的是: 提高访问速度, 缓冲区Bu ...

  3. java 操作Zip文件(压缩、解压、加密)

    java 操作Zip文件(压缩.解压.加密) 依赖:点击下载 package com.zxl.test;import net.lingala.zip4j.model.ZipParameters; im ...

  4. java实现上传zip/rar压缩文件,自动解压

    在pom中添加解压jar依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&q ...

  5. Java NIO内存映射文件

    Java NIO 内存映射文件 文件操作的四大方法 效率对比 内存映射文件 缓冲区 缓冲区的获得: 文件加锁机制 文件锁使用注意点: 文件操作的四大方法 前提:内存的访问速度比磁盘高几个数量级,但是基 ...

  6. Java代码实现解压文件包和压缩文件的工具类

    最近开发任务比较多,这两天陆陆续续整理了一点资料上传一下,这个是前段时间用到的解压和压缩文件的工具类,网上找了一些,自己补充一下,现在先分享一下,希望对各位同学有所帮助! package com.as ...

  7. Java生成Json文件添加到ZIP压缩并导出

    Java生成Json文件添加到ZIP压缩并导出 前言 代码说明 小结 前言 需要根据在前端选择的文件列表生产Json文件并导出Zip文件 代码说明 前端部分的方法: // 导出选中的文件exportF ...

  8. 关于使用zip4j实现解压与压缩文件,以及向压缩文件中添加文件 , 解压带密码的压缩文件 , 向压缩文件添加密码

    解压与压缩文件 1.Zip4j介绍 zip4j官网:http://www.lingala.net/zip4j/ 可以在"download"页面下载官方示例进行学习. 特征: 从Zi ...

  9. hprof文件分析工具_【赵强老师】如何分析Java的内存溢出问题

    欢迎关注赵强老师微信公众号:myitshare 一.什么是内存溢出? 内存溢出(OOM:out of memory)通俗理解就是内存不够,通常在运行大型软件或游戏时,软件或游戏所需要的内存远远超出了你 ...

  10. java文件处理之压缩,分割

    http://blog.csdn.net/ycg01/article/details/1366648 java文件处理之压缩,分割 标签: javaexceptionimportnullbytefil ...

最新文章

  1. python在windows下操作word的方法的代码
  2. 学习动态性能表(20)--v$waitstat
  3. 2022-02-09
  4. jqGrid的autoencode参数设置为true在客户端可能引发的编码问题
  5. php可以集成萤石监控吗,萤石多功能IP摄像机 真的可以让家更安全吗?
  6. java try catch陷阱_Java异常处理最佳实践及陷阱防范
  7. 同济大学自动化与计算机科学,同济大学本科专业选通信工程好,还是选自动化好呢?...
  8. 云原生的本质_云原生2.0的逻辑之辩,如何让每个企业都成为新云原生企业
  9. 菜鸟的学习之路(12) —HashSet类详解
  10. 善用VS中的Code Snippet来提高开发效率
  11. ISO9001-2008标准(中英文对照)
  12. iOS架构-cocoaPods之Podfile语法(18)
  13. 最新图片交替闪现效果代码
  14. 身份证复印件正确签注写法 -- 很重要!
  15. 去毛刺服务行业调研报告 - 市场现状分析与发展前景预测
  16. oracle gi和gc的区别,gl值(gi值跟gl值有什么区别)
  17. 通过WebView实现简单的浏览器
  18. 塞瓦定理,逆定理,及其引伸的证明
  19. ajax跨域获取cookie,ajax跨域获取cookie信息(示例代码)
  20. 【托业】【跨栏】TEST05

热门文章

  1. 和方舟rust一样的手游_2020年最令人期待的端改手游盘点,《方舟:生存进化》名列前茅...
  2. android创建wifi热点,Android 4.0.3创建wifi热点API
  3. text 热敏打印机_ESC/POS热敏打印机示例
  4. 将图片变换成3d对象
  5. filebeat配置介绍
  6. ribbon基于接口配置超时_Spring Cloud第二篇:服务消费者RestTemplate+Ribbon
  7. jQuery数据存储的相关方法
  8. 读图,特征提取——形状
  9. 项目开发版本控制----Git
  10. pytest-Mark数据驱动