首页 > 编程语言 >使用java.util.zip对生成的字节数组输出文件流 进行打包压缩(单个、批量),并返回压缩包文件的字节数组输出文件流用于(文件不落地)下载

使用java.util.zip对生成的字节数组输出文件流 进行打包压缩(单个、批量),并返回压缩包文件的字节数组输出文件流用于(文件不落地)下载

时间:2023-04-14 09:12:01浏览次数:55  
标签:文件 字节 输出 压缩 zipOut 数组 new

废话不多说 直接上代码

 

package gov.test.util;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;

/**
* 文件压缩工具包
* @author momo
* @since 2018-8-8
*/
public class ZipUtil {


/**
* 文件流压缩
* @author momo
* @since 2018-8-8
* @param baisByte 需要压缩的字节输出流(ByteArrayOutputStream)的字节数组
* @param fileName 需要压缩的文件名
* @return 压缩后字节数组输出流转为的字符串
* @throws IOException
*/
public static String zipByteArrayOutputStream(byte[] baisByte,String fileName) throws IOException {

//1.将需要压缩的字节输出流,转为字节数组输入流,
ByteArrayInputStream bais = new ByteArrayInputStream(baisByte);

//2.创建字节数组输出流,用于返回压缩后的输出流字节数组
ByteArrayOutputStream baos = new ByteArrayOutputStream();

//3.创建压缩输出流
ZipOutputStream zipOut = new ZipOutputStream(baos);

//zipOut.setEncoding("GBK");//设置编码格式,否则中文文件名乱码

//zipOut.setMethod(ZipOutputStream.DEFLATED);//进行压缩存储

//zipOut.setLevel(Deflater.BEST_COMPRESSION);//压缩级别值为0-9共10个级别(值越大,表示压缩越利害)

//4.设置ZipEntry对象,并对需要压缩的文件命名
zipOut.putNextEntry(new ZipEntry(fileName)) ;


//5.读取要压缩的字节输出流,进行压缩
int temp = 0 ;
while((temp=bais.read())!=-1){
zipOut.write(temp) ; // 压缩输出
}

// 关闭流
bais.close();
zipOut.close();

//字节数组输出流转为字符串并设置编码
String result =new String(baos.toByteArray(), "ISO-8859-1");

baos.close();// 关闭流

return result;
}

 

 

 

/**
* 批量文件流压缩
* @author momo
* @since 2018-8-9
* @param baisBytes List<Map<被压缩压缩文件名, 被压缩的文件流>>
* @return 压缩后字节数组输出流转为的字符串
* @throws IOException
*/
public static String batchZipByteArrayOutputStream(List<Map<String, byte[]>> baisBytes) throws IOException {

//1.创建字节数组输出流,用于返回压缩后的输出流字节数组
ByteArrayOutputStream baos = new ByteArrayOutputStream();

//2.创建压缩输出流
ZipOutputStream zipOut = new ZipOutputStream(baos);

//zipOut.setEncoding("GBK");//设置编码格式,否则中文文件名乱码

//3.遍历要批量压缩的集合文件流
ByteArrayInputStream bais =null;
Map<String, byte[]> tempMap =null;
String fileName=null;
int temp = 0 ;
for (int i = 0; i < baisBytes.size(); i++) {

tempMap=baisBytes.get(i);

fileName=tempMap.keySet().iterator().next();

//3.1将需要压缩的字节输出流,转为字节数组输入流,
bais = new ByteArrayInputStream(tempMap.get(fileName));

//zipOut.setMethod(ZipOutputStream.DEFLATED);//进行压缩存储

//zipOut.setLevel(Deflater.BEST_COMPRESSION);//压缩级别值为0-9共10个级别(值越大,表示压缩越利害)

//3.2设置ZipEntry对象,并对需要压缩的文件命名
zipOut.putNextEntry(new ZipEntry(fileName));


//3.3读取要压缩的字节输出流,进行压缩
temp = 0 ;
while((temp=bais.read())!=-1){
zipOut.write(temp) ; // 压缩输出
}

// 3.4关闭流
bais.close();
}


zipOut.close();

//字节数组输出流转为字符串并设置编码
String result =new String(baos.toByteArray(), "ISO-8859-1");

baos.close();// 关闭流

return result;
}

}

标签:文件,字节,输出,压缩,zipOut,数组,new
From: https://www.cnblogs.com/lxc127136/p/17317230.html

相关文章

  • 还在用分割字符获取文件名等信息吗?
    stringfilespath=@"D:\Files\测试文件.doc";stringstrFilename=Path.GetFileName(filespath);//返回完整的文件名测试文件.docResponse.Write("返回完整的文件名:"+strFilename+"<br/>");stringextension=Path.GetExtension(filespath);//返......
  • Git之文件名乱码
    现象利用gitstatus查看待提交的文件,其中文件名中有中文,但是显示的中文字符是乱码乱码原因在默认设置下,中文文件名在工作区状态输出,中文名不能正确显示,而是显示为八进制的字符编码。解决方式设置git的**core.quotepath**选项为false,quotepath表示引用路径,加上–global表......
  • Node.js文件路径:Path模块
    path模块是nodejs的内置模块,便于我们去获取、操作文件路径记录一些注意事项:文件的绝对位置cjsconsole.log(__filename)mjsmjs中,不能使用__filename和__dirnameconsole.log(import.meta.url)文件所处的目录cjsconsole.log(__dirname)mjsimport{dirname}from"path......
  • POJ 1226 Substrings (后缀数组)
    题目地址:POJ1226将每一个字符串反转连接一次,再把所有字符串都连接起来,然后二分,找最大长度。注意与反转字符串之间不能直接相连。代码如下:#include<iostream>#include<string.h>#include<math.h>#include<queue>#include<algorithm>#include<stdlib.h>#include<ma......
  • POJ 2774 Long Long Message (后缀数组)
    题目地址:POJ2774后缀数组第一发!后缀数组真是太神奇了。。(好像每学一种新算法我都会这么说。。原理研究了好长时间,还有代码的实现,论文作者罗穗骞的代码太简洁。。好难看懂QAQ,看了好长时间。来一发后缀数组模板题,模板是用的倍增思想。代码如下:#include<iostream>#include......
  • 文件
    1、文件和文件夹计算机中将具有一定联系的数据作为一个单位进行保存和操作,即文件。文件夹是用于管理文件的结构。在linux中,将文件夹视作特殊的文件。2、文件基本属性文件名称、路径、大小创建时间、访问时间、更新时间3、权限4、隐藏文件5、文本文件和二进制文件文本文件......
  • 一文读懂使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件
    前言:​ 今天接了一个单子要求写一个基于pygame的贪吃蛇小游戏,打包成.exe文件。下面我就来教大家来python怎么打包文件,希望大家阅读这篇文章之后有所收获。下面看下通过Pyinstaller打包Pygame库写的小游戏程序出现的问题解决方法开发环境:Python:3.5.464位pyinstall:3.3.1一......
  • js中一个移除对象中子数组中空值的函数
    js中一个移除对象中子集数组中空值(null,undefined)的函数functionremoveNull(obj){letdelarr=[];for(letiinobj){//排除法寻找对象类型if(typeof(obj[i])==='boolean'||typeof(obj[i])==='string'||typeof(obj[i])==......
  • 数组的元素查找排序
    顺序查找顺序查找:挨个查看要求:对数组元素的顺序没要求publicstaticvoidarraySearch(intvalue){int[]arr={4,5,6,1,9};//intvalue=1;intindex=-1;for(inti=0;i<arr.length;i++){if(arr[i]......
  • SPOJ 705 New Distinct Substrings (后缀数组)
    后缀数组模板题。由于height数组是指与排名上一个的公共前缀,所以重复的个数是height[i]个,考虑当前这个字母所构成的子串的贡献即为n-sa[i]-height[i],然后累加即可。代码如下:#include<iostream>#include<string.h>#include<math.h>#include<queue>#include<algorithm......