Java多文件以ZIP压缩包导出的实现方法
作者:白枫J 发布时间:2023-10-08 14:05:20
标签:java,压缩包,导出
本文实例为大家分享了Java多文件以ZIP压缩包导出的具体代码,供大家参考,具体内容如下
1、使用java实现吧服务器的图片打包成一个zip格式的压缩包导出,多个文件打包导出。
2、代码如下:
**ImageByteUtil.java**
public class ImageByteUtil{
private static float QUALITY = 0.6f;
public static void compressZip(List<File> listfiles, OutputStream output,String encode, boolean compress,String alias){
ZipOutputStream zipStream = null;
try {
zipStream = new ZipOutputStream(output);
for (File file : listfiles){
compressZip(file, zipStream, compress,alias+"_"+(listfiles.indexOf(file)+1));
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if (zipStream != null) {
zipStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
private static void compressZip(File file, ZipOutputStream zipStream,
boolean compress,String alias) throws Exception{
FileInputStream input = null;
try {
input = new FileInputStream(file);
//zip(input, zipStream, file.getName(), compress);
zip(input, zipStream, alias+"."+file.getName().substring(file.getName().lastIndexOf(".")+1), compress);
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if(input != null)
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private static void zip(InputStream input, ZipOutputStream zipStream,
String zipEntryName, boolean compress) throws Exception{
byte[] bytes = null;
BufferedInputStream bufferStream = null;
try {
if(input == null)
throw new Exception("获取压缩的数据项失败! 数据项名为:" + zipEntryName);
// 压缩条目不是具体独立的文件,而是压缩包文件列表中的列表项,称为条目,就像索引一样
ZipEntry zipEntry = new ZipEntry("图片/"+zipEntryName);
// 定位到该压缩条目位置,开始写入文件到压缩包中
zipStream.putNextEntry(zipEntry);
if (compress) {
bytes = ImageByteUtil.compressOfQuality(input, 0);
zipStream.write(bytes, 0, bytes.length);
} else {
bytes = new byte[1024 * 5];// 读写缓冲区
bufferStream = new BufferedInputStream(input);// 输入缓冲流
int read = 0;
while ((read = bufferStream.read(bytes)) != -1) {
zipStream.write(bytes, 0, read);
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (null != bufferStream)
bufferStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static byte[] compressOfQuality(File file, float quality) throws Exception{
byte[] bs = null;
InputStream input = null;
try {
input = new FileInputStream(file);
bs = compressOfQuality(input,quality);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (input != null)
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return bs;
}
public static byte[] compressOfQuality(InputStream input, float quality)
throws Exception {
ByteArrayOutputStream output = null;
try {
output = new ByteArrayOutputStream();
if(quality == 0){
Thumbnails.of(input).scale(1f).outputQuality(QUALITY)
.toOutputStream(output);
} else {
Thumbnails.of(input).scale(1f).outputQuality(quality).toOutputStream(output);
}
return output.toByteArray();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (output != null)
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
}
**Main.java**
public static void main(String[] args){
//要导出的文件集合,添加自己需要导出的文件
List<File> ListFiles = new ArrayList<>();
//调用工具类,参数说明(需要导出的文件集,ByteArrayOutputStream对象,编码,是否压缩【true,false】,文件名称前缀)
ImageByteUtil.compressZip(ListFiles, out, "UTF-8", false,"LWJ");
//指定导出格式
ReturnContext.addParam("exportFileName","extFile.zip");
ReturnContext.addParam("mimeType", "zip");
return in;
}
3、此功能是根据在开发过程中项目需要实现的,测试可正常使用,可更改定制。
来源:https://blog.csdn.net/lovelongjun/article/details/76104192


猜你喜欢
- 本文实例讲述了Android编程实现将压缩数据库文件拷贝到安装目录的方法。分享给大家供大家参考,具体如下:public void copyZ
- 前言:本文主要介绍内容有:一个串行调用的例子(App首页信息查询)CompletionService实现并行调用抽取通用的并行调用方法代码思
- 网上找的一个单页面通讯录,修改之后将添加联系人和修改/删除联系人分为两个独立页面MainActivitypackage com.exampl
- 一.介绍门面模式(Facade Pattern)属于结构型模式。门面模式又叫作外观模式,通过给多个复杂的子系统提供一个门面(高层接口),使这
- 1.效果图如下:2.controller层代码:import java.util.HashMap;import java.util.Map;
- 1) 要及时回收Bitmap的内存Bitmap类有一个方法recycle(),从方法名可以看出意思是回收。这里就有疑问了,Android系统
- 序列化(Serialize)是将对象转换成字节流,并将其用于存储或传输的过程,主要用途是保存对象的状态,以便在需要时重新创建该对象;反序列化
- 引言相信大家在生活中,特别是最近的双十一活动期间,会收到很多短信,而那些短信都有两个特征,第一个是几乎都是垃圾短信,这个特点此处可以忽略不计
- 类加载机制java类从被加载到JVM到卸载出JVM,整个生命周期包括:加载(Loading)、验证(Verification)、准备(Pre
- 首先贴一下搭配的环境:配置:Eclipse4.3.2jdk1.7_45Mysql 5.0+然后切入正题:1、login.jsp主要是使用OG
- 本文实例讲述了java实现的DES加密算法。分享给大家供大家参考,具体如下:一、DES加密算法介绍1、要求密钥必须是8个字节,即64bit长
- 需求:接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承实体类(concrete class)?抽象类中是否
- 本文实例为大家分享了Android日历控件的使用方法,供大家参考,具体内容如下MainActivity.java代码:package sis
- 1. 生命周期感知1.1 生命周期感知组件我们知道,Controller(Activity or Fragment) 都是有生命周期的,但是
- 1. 前言随着数据量和调用量的增长,用户对应用的性能要求越来越高。另外,在实际的服务中,还存在着这样的场景:系统在组装数据的时候,对于数据的
- 前置知识Kotlin协程不是什么空中阁楼,Kotlin源代码会被编译成class字节码文件,最终会运行到虚拟机中。所以从本质上讲,Kotli
- 在微服务架构中,我们将一个项目拆分成很多个独立的模块,这些独立的模块通过远程调用来互相配合工作,但是,在高并 * 况下,通信次数的增加会导致总
- AsyncTask是Android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度
- Java String类的concat方法在了解concat()之前,首先需要明确的是String的两点特殊性长度不可变值不可变这两点从源码
- 测试代码如下: package swt_jface.demo; import org.eclipse.jface.window.Applic