【昕宝爸爸小模块】深入浅出之POI是如何做大文件的写入的

news2024/11/25 18:41:40

在这里插入图片描述

➡️博客首页       https://blog.csdn.net/Java_Yangxiaoyuan


       欢迎优秀的你👍点赞、🗂️收藏、加❤️关注哦。


       本文章CSDN首发,欢迎转载,要注明出处哦!


       先感谢优秀的你能认真的看完本文,有问题欢迎评论区交流,都会认真回复!


🔓POI如何做大文件的写入

  • 一、🏆文件和POI之间的区别是什么?
  • 二、🏆POI对于当今的社会发展有何重要性?
  • 三、🏆POI大文件的写入
    • 3.1🎖️使用XSSF写入文件
    • 3.2🎖️使用SXSSFWorkbook写入文件
    • 3.3🎖️对比结果
  • 四、🏆拓展知识
    • 4.1🎖️为什么SXSSFWorkbook占用内存更小?


上一篇博文🎖️: 什么是POI,为什么它会导致内存溢出?


上一篇博文中介绍了POI的内存溢出以及几种Workbook,那么,我们在做文件写入的时候,
该如何选择呢?他们在内存的使用上有什么差异呢?

一、🏆文件和POI之间的区别是什么?


1. 文件是一种数据存储的形式,可以包含各种信息,如文本、图像、音频、视频等。而POI是一种Java API,用于处理各种类型的文件,包括Excel、Word、PowerPoint等。


2. 文件可以通过多种方式创建和编辑,如手动编写、使用特定的编辑工具等。而POI提供了一组API,可以通过编程方式读取、创建和修改文件内容。


3. 文件可以保存在本地计算机或云存储中,可以通过文件系统路径或URL进行访问。而POI可以处理文件的内容和格式,包括读取和写入文件,以及对文件进行格式化等操作。


4. 文件可以通过不同的应用程序打开和处理,如使用Microsoft Office、OpenOffice等。而POI可以在Java环境中使用,无需安装其他应用程序。


总的来说:文件是数据的表现形式,而POI是一种处理文件的工具,可以帮助开发人员对各种类型的文件进行读写和修改操作。


二、🏆POI对于当今的社会发展有何重要性?


POI (Points of Interest) 对于当今的社会或科技发展具有重要性。POI 是指那些在地理位置上有特殊意义或吸引力的地点,如公司、餐馆、景点等。以下是POI在社会和科技发展中的重要性:


1. 旅游和出行指南:POI提供了旅行者必需的信息,如旅游景点、酒店、餐馆等。这对于旅游业具有重要意义,使得游客能够更好地计划和享受旅行。


2. 本地搜索和导航:POI可以在地图和导航应用中进行本地搜索,帮助用户寻找周围的商店、服务和设施。对于定位服务、导航软件和城市规划具有重要作用。


3. 商业分析和市场营销:POI数据可以帮助企业进行市场分析,了解商业活动和竞争环境。例如,通过分析POI数据,企业可以预测市场趋势、优化商业策略或选择合适的营销渠道。


4. 交通和城市规划:POI数据可以帮助交通规划者了解城市的交通流量和交通瓶颈,以便进行交通规划和改善。此外,POI数据还可以用于城市规划,帮助决策者制定城市发展策略和公共设施布局。


5. 社交媒体和位置服务:POI数据被用于社交媒体应用中,用户可以在其发布的照片或信息中标记地点。这为用户提供了更多的社交互动,并为社交媒体平台提供了更精确的地理数据。


总之POI对于当今的社会和科技发展至关重要。它为旅游业、市场营销、城市规划和交通管理提供了有价值的数据和信息,同时也为用户提供了更好的导航、搜索和社交体验。


🙌了解这些之后,我们接下来分别使用XSSFWorkbook和SXSSFWorkbook来写入一个Excel文件,分别看一下堆内存的使用情况。

三、🏆POI大文件的写入


3.1🎖️使用XSSF写入文件


package com.ifbranch.excel.write;


import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss .usermodel.Row;
import org.apache.poi.ss .usermodel.Sheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;


import java.io.FileOutputStream;
import java.io.IOException;
import java.util.UUID;
/**
* @author xinbaobaba
*/
public class XSSFExcelTest {
	public static void main(String[] args) throws InterruptedException {
		// 创建一个新的工作簿
		XSSFWorkbook workbook = new XSSFWorkbook();
		
		
		// 创建一个新的表格
		Sheet sheet = workbook.createSheet("Example Sheet");
		
		for (int i = 0; i < 10000; i++) {
			
			// 创建行从0开始计数
			Row row = sheet.createRow(i);
			
			for (int j = ; j < 100; j++) {
				
				//在行中创建单元格(从0开始计数)
				Cell cell = row.createCell(j);
				
				//设置单元格的值
				cell.setCellValue(UUID.randomUUID().toString());
				
			}
		}
		
		// 设置文件路径和名称
		String filename = "example.xlsx";
		try (File0utputStream outputStream = new FileOutputStream(filename)) {
			
			//将工作簿写入文件
			workbook.write(outputStream);
			
		}catch (IOException e) {
			
			e.printstackTrace();
		} finally {
			
			try {
				
				// 关闭工作簿资源
				workbook.close();
				
			}catch (IOException e) {
				
				e.printstackTrace();
			}
		}
	}
}


运行main方法的过程中,通过arthas看一下堆内存的使用情况:


curl -0 https://arthas .aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
→  java -jar arthas-boot.jar
[INFO] JAVA HOME: /Library/Java/JavaVirtualMachines/jdk1.8.0 311.jdk/Contents/Home/jre
[INFO] arthas-boot version: 3.7.1
[INFO] Found existing java process, please choose one and input the serial number of the 
process, eg : 1. Then hit ENTER.
*[1]: 41417 org.jetbrains.idea.maven.server.RemoteMavenServer36
 [2]: 4874
 [3]: 43484 org.jetbrains.jps.cmdline.Launcher
 [4]: 43485 excel.write.XSSFExcelTest
4
 [INFO]arthas home: /Users/hollis/.arthas/lib/3.7.1/arthas
 [INFO] Try to attach process 43485
 Picked up JAVA TOOL OPTIONS:
 [INFO] Attach process 43485 success.
 [INFO] arthas-client connect 127.9.0.1 3658

执行memory命令(这个执行的时间点很重要,我是在 String filename = “example.xlsx”;前输出了一行日志,然后sleep 50s,我在控制台看到这行日志之后开始查看堆内存情况):


[arthas@43485]$ memory

得到结果:


在这里插入图片描述


即占用堆内存1200+M。


3.2🎖️使用SXSSFWorkbook写入文件


package excel.write;


import org.apache.poi.ss .usermodel.Cell;
import org.apache.poi.ss .usermodel.Row;
import org.apache.poi.ss .usermodel.Sheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;


import java.io.FileOutputStream;
import java.io.IOException;
import java.util.UUID;

public class SXSSFExcelTest {
    public static void main(String[] args) {
        // 创建一个新的工作簿
        SXSSFWorkbook workbook = new SXSSFWorkbook();

		// 创建一个新的表格
		Sheet sheet = workbook.createSheet("Example Sheet");
		for(int i=0;i<1000;i++){
		    // 创建行(从0开始计数)
		    Row row = sheet.createRow(i);
		    for(int j = 0; j < 100; j++){
		        //在行中创建单元格(从0开始计数)
		        Cell cell = row.createCell(j);
				
				// 设置单元格的值
				cell.setCel1Value(UuID.randomUuID().tostring());
				
		    }
		}
		
		// 设置文件路径和名称
		String filename = "example.xlsx";

		try (FileOutputStream outputStream = new FileOutputStream(filename)) {
			//将工作演写入文件
			workbook.write(outputstream);
		}catch (IOException e) {
			e.printStackTrace();
		} finally {
		    try {
		    	//关闭工作簿资源
		    	workbook.close();
		    } catch (IOException e) {
		        e.printstackTrace();
		    }
		}
    }
}

同样通过Arthas查看内存占用情况:


在这里插入图片描述


占用内存148M左右


3.3🎖️对比结果


同样的一份文件写入,XSSFWorkbook需要1200+M,SXSSFWorkbook只需要148M。所以大文件的写入,使用SXSSFWorkbook是可以更加节省内存的。


如果不方便使用arthas,也可以直接在JVM启动参数中增加Xmx150m的参数,运行以上两段代码,使用XSSFWorkbook的会地出OOM:


在这里插入图片描述


而使用SXSSFWorkbook时则不会。


So,在使用POI时,如果要做大文件的写入,建议使用SXSSFWorkbook,会更加节省内存。


四、🏆拓展知识


4.1🎖️为什么SXSSFWorkbook占用内存更小?


接下一篇博文🎖️: 为什么POI的SXSSFWorkbook占用内存更小?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1393626.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JVM】性能调优

一、前言 性能调优&#xff0c;顾名思义&#xff0c;就是对系统或软件的性能进行优化&#xff0c;以提高其运行效率和响应速度。在计算机科学中&#xff0c;性能调优通常涉及到硬件、操作系统、数据库、网络等多个方面。对于Java开发者来说&#xff0c;JVM&#xff08;Java虚拟…

centos7 arm服务器编译升级安装动态库libstdc++.so.6,解决GLIBC和CXXABI版本低的问题

前言 由于centos7内置的libstdc.so.6版本太低&#xff0c;导致安装第三方包的时候&#xff0c;会报“CXXABI_1.3.8”不存在等问题。 自带的打印如下&#xff1a; strings /usr/lib64/libstdc.so.6 | grep GLIBC strings /usr/lib64/libstdc.so.6 | grep CXXABI 如图 升级 注…

RK3399平台入门到精通系列讲解(USB篇)UDC 层 usb_gadget_probe_driver 接口分析

🚀返回总目录 文章目录 一、UDC:usb_gadget_probe_driver函数分析二、usb_gadget_driver 结构详细介绍三、usb_udc 结构详细介绍一、UDC:usb_gadget_probe_driver函数分析 UDC层的一项基本任务是向上层提供usb_gadget_probe_driver()接口函数。 上层调用者为composite.c中…

【征服redis7】谈谈Redis的RDB持久化方式

从现在开始&#xff0c;我们来探讨redis的一个非常重要的问题——集群&#xff0c;要讨论集群&#xff0c;我们需要先理解redis持久化数据的方法&#xff0c;因为集群本质上就是将一个集群的数据同步到其他机器上。 Redis 6的持久化机制主要有两种&#xff1a;RDB&#xff08;…

WordPress回收站自动清空时间?如何关闭回收站或设置自动清理天数?

我们在WordPress后台的文章、页面、评论等页面都可以看到有回收站&#xff0c;意思就是我们不能直接删除某篇文章、页面、评论&#xff0c;而是需要现将它们移至回收站&#xff0c;然后再到回收站永久删除&#xff0c;或等回收站自动清理。 如上图所示&#xff0c;WordPress 6.…

Django笔记(一):环境部署

目录 Python虚拟环境 安装virtualenv 创建环境 激活环境 关闭&#xff1a; 安装Django VSCode配置 Python插件 Django插件 解释器选择 Django部署 创建项目 创建app 创建模板 编写视图 编写路由 启动服务器 访问 Python虚拟环境 安装virtualenv pip i…

H5小游戏如何提升APP变现收益?

在当前用户规模稳定但变现压力增加的背景下&#xff0c;开发者需要挖掘用户价值&#xff0c;提高营收&#xff0c;这成为开发者关注的重点话题。对于那些“用户用完即走”的APP产品来说&#xff0c;接入H5游戏能够吸引停留&#xff0c;为其带来收入上的增长。 一、什么是H5游戏…

面经-redis缓存

什么是Redis Redis(Remote Dictionary Server)键只能为字符串&#xff0c;值&#xff1a;字符串、列表、集合、散列表、有序集合。Redis 用来做分布式锁。支持事务 、持久化、LUA脚本、LRU驱动事件、多种集群方案。 Redis为什么这么快 完全基于内存&#xff0c;数据结构简单…

如何在CentOS下使用Docker部署Halo博客网站并结合内网穿透远程访问

文章目录 ⛳️ 推荐1. Docker部署Halo1.1 检查Docker版本如果未安装Docker可参考已安装Docker步骤&#xff1a;1.2 在Docker中部署Halo 2. Linux安装Cpolar2.1 打开服务器防火墙2.2 安装cpolar内网穿透 3. 配置Halo个人博客公网地址4. 固定Halo公网地址 ⛳️ 推荐 前些天发现了…

selenium-java中切换iframe

1、当iframe中有固定的name或者id时可以通过name和id进行切换,代码如下 driver.switchTo().frame("name"); 2、当iframe中没有固定的name或者id时可以通过iframe角标进行切换&#xff0c;在浏览器通过ctrlf快捷键&#xff0c;搜索标签框输入//iframe;来查看当前ifr…

web开发学习笔记(9.Tomcat介绍)

1.简介 2.tomcat和nginx等web应用服务器的区别 http://t.csdnimg.cn/OL9Qt 3.tomcat基本使用 4.tomcat更改端口号 5. 部署

三大爆款婴儿洗衣机深度测评,希亦、小吉、鲸立哪款最值得入手?

婴儿洗衣机&#xff0c;顾名思义就是专门给婴儿使用的洗衣机&#xff0c;它的功能更加有针对性&#xff0c;同时设计上也有普通洗衣机不同。对于不少有工作的宝爸宝妈而言&#xff0c;在日常生活中并没有充足的时间可以给孩子洗衣物&#xff0c;婴儿洗衣机是非常有必要买的。而…

使用freessl为网站获取https证书及配置详细步骤

文章目录 一、进入freessl网站二、修改域名解析记录三、创建证书四、配置证书五、服务启动 一、进入freessl网站 首先进入freessl网站&#xff0c;需要注册一个账号 freessl网站 进入网站后填写自己的域名 接下来要求进行DCV配置 二、修改域名解析记录 到域名管理处编辑域名…

服务器——Vscode选择虚拟环境编译器后,无法跳转至对应的python路径的解决办法

一、现象 输入 which python&#xff0c;显示 /bin/python&#xff0c;而不是对应的python路径。 二、原因分析 该用户账户下的.bashrc文件手动指定了python路径。 三、解决办法 将手动指定的python路径代码注释&#xff0c;这样就跟随编译器&#xff0c;自动选择python路…

k8s---对外服务 ingress

目录 目录 目录 ingress与service ingress的组成 ingress-controller&#xff1a; ingress暴露服务的方式 2.方式二&#xff1a;DaemonSethostnetworknodeSelector DaemonSethostnetworknodeSelector如何实现 3.deploymentNodePort&#xff1a; 虚拟主机的方式实现http代…

戴森持续深耕室内空气质量研究,携手商业空间打造全场景的洁净呼吸新体验

[2024年 1 月 18 日, 中国上海] 随着气温的日渐下降&#xff0c;家人陪伴和好友相聚也逐渐回归室内。和三两好友一起动手做些烘焙美食&#xff0c;相约美术馆看展&#xff0c;或室内亲子乐园成为不少家庭冬日生活的新风尚。为了进一步洞察消费者生活方式背后对于健康呼吸的多样…

Mybatis----面向接口

让mybatis自动生成dao层接口的实现类 这是dao层接口的实现类&#xff0c;在mybatis中我们可以省略这种实现接口的方式&#xff0c;直接面向接口操作数据库&#xff0c;mybatis可以帮我们自动生成接口的实现类&#xff0c;也就是下面这个实现类mybatis帮我们生成了。 1、修改se…

鸿蒙开发之状态管理

State 组件内状态 State装饰的变量&#xff0c;会和自定义组件的渲染绑定起来。当状态改变时&#xff0c;UI会发生对应的渲染改变。在状态变量相关装饰器中&#xff0c;State是最基础的&#xff0c;使变量拥有状态属性的装饰器&#xff0c;它也是大部分状态变量的数据源。 装…

数据库事务隔离级别的总结

一、数据库四种隔离级别 RU&#xff08;READ-UNCOMMITTED&#xff09; 读取事务未提交的数据。RC&#xff08;READ-COMMITTED&#xff09; 读取到事务已提交的数据。RR&#xff08;REPEATABLE-READ&#xff09; 可重复读SR&#xff08;SERIALIZABLE&#xff09; 串行化 二、四…

chisel入门初步1——基4的booth编码的单周期有符号乘法器实现

基4的booth编码乘法器原理说明 基2的booth编码 本质来说就是一个裂项重组&#xff0c;乘法器最重要的设计是改变部分积的数量&#xff0c;另外在考虑有符号数的情况下&#xff0c;最高位符号位有特别的意义。 &#xff08;注&#xff1a;部分积是指需要最后一起加和的所有部分…