【POI的如何做大文件的写入】

在这里插入图片描述

🔓POI如何做大文件的写入

  • 🏆文件和POI之间的区别是什么?
  • 🏆POI对于当今的社会发展有何重要性?
  • 🏆POI大文件的写入
    • 🎖️使用XSSF写入文件
    • 🎖️使用SXSSFWorkbook写入文件
      • 🎖️对比结果
  • 🏆拓展知识
    • 🎖️为什么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大文件的写入

🎖️使用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;

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。

🎖️使用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左右

🎖️对比结果

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

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

在这里插入图片描述
而使用SXSSFWorkbook时则不会。

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

🏆拓展知识

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设计模式——模板方法模式

引言 模板方法模式是一种行为设计模式&#xff0c; 它在超类中定义了一个算法的框架&#xff0c; 允许子类在不修改结构的情况下重写算法的特定步骤。 问题 假如你正在开发一款分析公司文档的数据挖掘程序。 用户需要向程序输入各种格式 &#xff08;PDF、 DOC 或 CSV&#…

【C语言】实战项目——通讯录

引言 学会创建一个通讯录&#xff0c;对过往知识进行加深和巩固。 文章很长&#xff0c;要耐心学完哦&#xff01; ✨ 猪巴戒&#xff1a;个人主页✨ 所属专栏&#xff1a;《C语言进阶》 &#x1f388;跟着猪巴戒&#xff0c;一起学习C语言&#x1f388; 目录 引言 实战 建…

加密的艺术:对称加密的奇妙之处(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

推荐EasyImages简单图床源码

开源好用EasyImages简单图床源码分享&#xff0c;虽然它是开源程序&#xff0c;但功能一点也不弱&#xff0c;不仅支持多文件上传、文字/图片水印、支持API和鉴黄、还能自定义代码&#xff0c;最重要的是它不强制使用数据库运行&#xff0c;这就给我们的部署和维护带来极大方便…

vue自定义指令及常用的自定义指令封装

vue2 自定义指令 官网链接https://v2.cn.vuejs.org/v2/guide/custom-directive.html 指令注册 这里是一个 Vue2 的指令合集&#xff0c;详细的指令移步下面具体的指令文章&#xff0c;现在我们在这里要介绍如何在项目中统一管理和使用这些指令。 注册指令 单文件引入注册 …

设计可编辑表格组件

前言 什么是可编辑表格呢&#xff1f;简单来说就是在一个表格里面进行表单操作&#xff0c;执行增删改查。这在一些后台管理系统中是尤为常见的。 今天我们根据vue2 element-ui来设计一个表单表格组件。&#xff08;不涉及完整代码&#xff0c;想要使用完整功能可以看底部连…

[C语言]大小端及整形输出问题

假设在一个32位little endian 的机器上运行下面的程序&#xff0c;结果是多少 ? 1.1先看以下三个程序 #include <stdio.h> int main() {long long a 1, b 2, c 3;printf("%lld %lld %lld\n", a, b, c); // 1 2 3printf("%d %d %d %d %d %d\n&quo…

ensp创建配置环境,实现全网互访

文章目录 创建配置环境&#xff0c;实现全网互访配置步骤接入层交换机&#xff08;sw4、sw5&#xff09;划分vlan汇聚层交换机&#xff08;sw2、sw3&#xff09;配置ip地址作为vlan网关、与sw1 ip地址直连核心层交换机&#xff08;sw1&#xff09;配置ip地址与汇聚层交换机&…

echarts地图的常见用法:基本使用、区域颜色分级、水波动画、区域轮播、给地图添加背景图片和图标、3d地图、飞线图

前言 最近几天用echarts做中国地图&#xff0c;就把以前写的demo&#xff1a;在vue中实现中国地图 拿来用&#xff0c;结果到项目里直接报错了&#xff0c;后来发现是因为版本的问题&#xff0c;没办法只能从头进行踩坑了。以下内容基于vue3 和 echarts 5.32 基本使用 获取地…

java内置的数据结构

Java语言提供了许多内置的数据结构&#xff0c;包括&#xff1a; 1. 数组&#xff08;Array&#xff09;&#xff1a;数组是最基本的数据结构之一&#xff0c;它是一个有序的元素集合&#xff0c;每个元素都有一个对应的索引。在Java中&#xff0c;数组可以通过声明和初始化来创…

python学习1补充

大家好&#xff0c;这里是七七&#xff0c;这个专栏是用代码实例来学习的&#xff0c;不是去介绍很多知识的。 话不多说&#xff0c;开始今天的内容 目录 代码1 代码2 代码3 代码4 代码5 学习1的总代码 代码1 groupeddf.groupby(单品编码) result{} groupeddf.groupb…

Vue2-动态组件案例

1.component介绍 说明&#xff1a; Type: string | ComponentDefinition | ComponentConstructor Explanation: String: 如果你传递一个字符串给 is&#xff0c;它会被视为组件的名称&#xff0c;用于动态地渲染不同类型的组件。这是一个在运行时动态切换组件类型的常见用例。…

计算机组成原理学习(输入输出系统)

目录 输入输出系统&#xff08;i/o系统&#xff09; 一.现代计算机的结构 二.常见的&#xff08;I/O设备或者是外部设备&#xff09; ​ 三.主机如何与I/O设备进行交互 四.I/O控制方式简介 五.I/O系统的基本组成 输入输出系统&#xff08;i/o系统&#xff09; 一.现代计算…

嵌入式开发中的总线与时钟

总线 AHB总线 AHB的全称是"Advanced High-performance Bus",中文翻译就是"高级高性能总线"。这是一种在计算机系统中用于连接不同硬件组件的总线架构,它可以帮助这些组件之间高效地传输数据和信息。这个总线架构通常用于处理速度较快且对性能要求较高的…

VAR模型

VAR&#xff08;Vector Autoregression&#xff09;模型是一种用于时间序列分析的统计模型&#xff0c;它可以描述多个变量之间的相互关系和动态演化。VAR模型最初是由Sims&#xff08;1980&#xff09;提出的&#xff0c;广泛应用于宏观经济学、金融领域以及其他时间序列数据分…

嵌入式培训-数据结构-day23-线性表

线性表 线性表是包含若干数据元素的一个线性序列 记为&#xff1a; L(a0, ...... ai-1, ai, ai1 ...... an-1) L为表名&#xff0c;ai (0≤i≤n-1)为数据元素&#xff1b; n为表长,n>0 时&#xff0c;线性表L为非空表&#xff0c;否则为空表。 线性表L可用二元组形式描述…

Python接口测试 requests.post方法中data与json参数区别

引言 requests.post主要参数是data与json&#xff0c;这两者使用是有区别的&#xff0c;下面我详情的介绍一下使用方法。 Requests参数 1. 先可以看一下requests的源码&#xff1a; def post(url, dataNone, jsonNone, **kwargs):r"""Sends a POST request.…

缓存击穿的原因和解决方案

缓存击穿 原因&#xff1a;一个被高并发访问并且缓存重建业务较复杂的key突然失效了&#xff0c;无数的请求访问会在瞬间给数据库带来巨大的冲击 解决方案 1.互斥锁 优点 没有额外的内存消耗保证一致性实现简单 缺点 线程需要等待&#xff0c;性能受影响可能有死锁风险 …

Frontier ,MDPI T3系列,植物科学领域高质量期刊分级目录发布!

公众号&#xff1a;生信漫谈&#xff0c;获取最新科研信息&#xff01; Frontier &#xff0c;MDPI T3系列&#xff0c;植物科学领域高质量期刊分级目录发布&#xff01;https://mp.weixin.qq.com/s/ukbjIgdyaza7LmKmZmy5bw 2023年3月31日&#xff0c;中国科学技术大学科研部…

Linux 定时删除过期文件

需求说明 每日凌晨0点定时删除/temp目录下的所有一个月未被访问的文件。 脚本实现 linux 终端输入crontab -e&#xff0c;添加定时任务脚本命令 [rootlocalhost ~]# crontab -e在文件末尾追加 0 0 * * * find /temp -atime 30 -exec rm -rf {} \;参数说明 命令格式&#…