首页 > 编程语言 >java 异步导出zip压缩包

java 异步导出zip压缩包

时间:2024-02-23 14:57:33浏览次数:34  
标签:info java log zip param new response 压缩包

需求:图片文件太大,采用压缩包下载

/**
	 * 图片zip压缩包下载
	 * @param response
	 * @param zipName 压缩包名字
	 * @param urls 文件图片下载URL路径
	 * @param imagesUrls URL与对应文件名字map
	 * @throws Exception
	 */
public static void exportZip(HttpServletResponse response, String zipName, String[] urls, Map<String,String> imagesUrls) throws Exception {
		log.info("======1=======");
		// 创建一个自定义线程池
		ExecutorService executor = Executors.newFixedThreadPool(10);

		CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
			log.info("======2=======");
			try (ZipOutputStream zipOut = new ZipOutputStream(response.getOutputStream())) {
				response.setHeader("content-type", "application/octet-stream");
				response.setHeader("Content-disposition", "attachment;filename=" + zipName);
				response.setCharacterEncoding("utf-8");
				log.info("======3=======");
				for (String url : urls) {
					try (InputStream in = new BufferedInputStream(new URL(url).openStream())) {
						zipOut.putNextEntry(new ZipEntry(imagesUrls.get(url) + ".jpg"));//我这里下载的都是图片,正常应该根据URL路径获取文件类型
						byte[] buffer = new byte[1024];
						int len;
						while ((len = in.read(buffer)) > 0) {
							zipOut.write(buffer, 0, len);
						}
						zipOut.closeEntry();
					}
				}
			} catch (IOException e) {
				throw new RuntimeException("Error exporting ZIP file", e);
			}
		},executor);
		log.info("======4=======");
		// 等待异步任务完成
		//Thread.sleep(8000);
		future.get(); // 这将阻塞直到任务完成
		log.info("======5=======");
    }

标签:info,java,log,zip,param,new,response,压缩包
From: https://www.cnblogs.com/liucong/p/18029519

相关文章

  • java的基本循环结构之while循环
    1、while循环◆while是最基本的循环,它的结构为:while(布尔表达式){//循环内容只要布尔表达式为true,循环就会一直执行下去。我们大多数情况是会让循环停止下来的,我们需要一个让表达式失效的方式来结束循环少部分情况需要循环一直执行,比如服务器的请求响应监听等。循环条件一......
  • java的基本流程控制情况
    1、顺序结构顺序结构◆JAVA的基本结构就是顺序结构除非特别指明,否则就按照顺序一句一句执行。◆顺序结构是最简单的算法结构。语句与语句之间,框与框之间是按从上到下的顺序进行的,它是由若干个依次执行的处理步骤组成的,它是任何一个算法都离不开的一种基本算法结构。2、if单......
  • java中 Scanner类 使用相关情况
    1、Scanner类使用Scanner对象之前我们学的基本语法中我们并没有实现程序和人的交互,但是Java给我们提供了这样一个工具类,我们可以获取用户的输入。java.util.Scanner是Java5的新特征,我们可以通过Scanner类来获取用户的输入。◆基本语法:Scanners=newScanner(System.in);......
  • C# 与JAVA 的RSA 加密解密交互,C#使用BouncyCastle来实现私钥加密,公钥解密的方法
    因为一般C#的RSA加密解密都是公钥加密,私钥解密,没有私钥加密,公钥解密。在网上查了很多资料,终于看到有个博主的分享,关于私钥加密,公钥解密的解决方案,非常感谢(最下面有源网址)。此处就把简单应用的源码附上,需要的自己去完善。 1、私钥加密,公钥解密的源码usingOrg.BouncyCastle.......
  • java对象结构与内置锁
    1.java对象结构不同的JVM的对象结构的实现不一样,这里以HotSpotJVM为例。HotSpotJVM并没有将Java实例对象直接一对一的映射到本地(native)的C++对象,而是设计了一个oop-klass模型。什么是OOP?实际上,OOP(OrdinaryObjectPointer,普通对象指针)是指对象-类二者中的对象,表示对象......
  • Java基础04:数据类型扩展及面试题讲解
    1.进制运算......
  • Java 构造函数与修饰符详解:初始化对象与控制权限
    Java构造函数Java构造函数是一种特殊的类方法,用于在创建对象时初始化对象的属性。它与类名相同,并且没有返回值类型。构造函数的作用:为对象的属性设置初始值执行必要的初始化操作提供创建对象的多种方式构造函数的类型:默认构造函数:无参数的构造函数,如果用户没有明......
  • Java基础03:数据类型讲解
    1.数据类型1.1强类型语言1.1.1要求变得使用要严格符合规定,所有变量都必须先定义后才能使用1.2弱类型语音1.2.1要求变得使用要符合规定,所有变量都必须先定义后才能使用1.3Java的数据类型分为两大类1.3.1基本类型(primitivetype):......
  • JavaScript
    JavaScriptJavaScript(简称JS)是一种用于网页交互的脚本语言,通常用于在网页上添加动态功能、交互性和响应式设计。它是一种基于对象和事件驱动的脚本语言,由Netscape公司(现在属于Mozilla公司)在1995年首次引入,最初被设计为在客户端执行。(1)varlet变量关键字varvarname......
  • Java基础02:标识符和关键字
    1.标识符1.1关键字 Java所有组成的部分都需要名字。类名、变量名以及方法名都被称为标识符。1.2标识符注意点1.2.1所有的标识符都应该以字母(A-Z或者a-z),美元符($)、或者下划线(_)开始1.2.2首字符之后可以是字母(A-Z或者a-z),美元符($)、或者......