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

在这里插入图片描述

➡️博客首页       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 43485Picked 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.hqwc.cn/news/411932.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

逆向使用webpack打包的网站

webpack webpack 是 JavaScript 应用程序的模块打包器,可以把开发中的所有资源&#xff08;图片、js文件、css文件等&#xff09;都看成模块&#xff0c;通过loader&#xff08;加载器&#xff09;和 plugins &#xff08;插件&#xff09;对资源进行处理&#xff0c;打包成符…

SpringBoot项目里用MultipartFile作为入参获取到的file为什么null

前言&#xff1a; 最近在项目中用到了Excel模板导入功能&#xff0c;但是在测试阶段用Postman测试时&#xff0c;通过Post请求&#xff0c;传到后端的File一直为null。其中前端传参和请求都没问题&#xff0c;后端的接参也没问题&#xff0c;问题出在过滤器的复用上。 问题场…

Windows如何安装VNC+Viewer+cpolar实现远程Ubuntu桌面?

文章目录 前言1. ubuntu安装VNC2. 设置vnc开机启动3. windows 安装VNC viewer连接工具4. 内网穿透4.1 安装cpolar【支持使用一键脚本命令安装】4.2 创建隧道映射4.3 测试公网远程访问 5. 配置固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址5.3 测试…

2.4 网络层01

2.4 网络层01 2.4.1 网络层概述 网络层的主要任务是实现网络互连&#xff0c;进而实现数据包在各网络之间的传输。 异构网络内部的计算机要想实现通信是不需要实现网络互联的&#xff0c;异构网络之间要想实现通信就必须实现网络互连。 路由器工作在五层协议体系结构的网络…

计算机毕业设计 基于Java的国产动漫网站的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

CSDN如何使用markdown

第一步&#xff1a;点击头像 第二步&#xff1a;选择管理博文 第三步&#xff1a;选择博客设置 第四步&#xff1a;勾选markDown编辑器 第四步&#xff1a;代码皮肤样式选择&#xff08;可选项&#xff09;

【论文阅读】Consistency Models

文章目录 IntroductionDiffusion ModelsConsistency ModelsDefinitionParameterizationSampling Training Consistency Models via DistillationTraining Consistency Models in IsolationExperiment Introduction 相比于单步生成的模型&#xff08;例如 GANs, VAEs, normalizi…

sonarqube的多分支检查

sonarqube的多分支检查 参考文档: Sonarqube(社区版)支持扫描多分支配置 SonarQute安装与多分支扫描分析插件安装 持续集成交付CICD&#xff1a;Sonarqube多分支代码扫描 1.手动安装插件 插件地址 : https://github.com/mc1arke/sonarqube-community-branch-plugin 需要注意的…

Spring MVC学习之——自定义日期转化器

日期转换器 在数据库中的日期数据是date类型&#xff0c;而如何我们想在页面自己添加数据&#xff0c;一般是使用年-月-日的形式&#xff0c;这种形式不仅date类型接收不到&#xff0c;而且传来的是String类型&#xff0c;此时&#xff0c;我们就可以自定义日期转换器来接收数…

【Internet Protocol】ip介绍,如何组局域网实现远程桌面和文件共享

文章目录 1.何为“上网”1.1 定义1.2 为什么连了WiFi就能上网了&#xff1f; 2.ip2.1 什么是ip2.2 为什么区分广域网和局域网&#xff0c;ip的唯一性2.3 如何查看设备的ip2.4 什么叫"ping"2.5 区分是否两个ip是否在同一局域网2.5.1 最稳妥的方式&#xff1a;ip&m…

(2023版)斯坦福CS231n学习笔记:DL与CV教程 (11) | 循环神经网络及视觉应用

前言 &#x1f4da; 笔记专栏&#xff1a;斯坦福CS231N&#xff1a;面向视觉识别的卷积神经网络&#xff08;23&#xff09;&#x1f517; 课程链接&#xff1a;https://www.bilibili.com/video/BV1xV411R7i5&#x1f4bb; CS231n: 深度学习计算机视觉&#xff08;2017&#xf…

《Linux C编程实战》笔记:出错处理

这一节书上把它放到线程这一章&#xff0c;按理说应该在前面就讲了 头文件errno.h定义了变量errno&#xff0c;它存储了错误发生时的错误码&#xff0c;通过错误码可以得到错误的信息 程序开始执行时&#xff0c;变量errno被初始化为0。很多库函数在执行过程中遇到错误时就会…