【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 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。

🎖️使用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.hqwc.cn/news/282653.html

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

相关文章

日期计算 C语言xdoj68

问题描述 给定一个年份y和一个整数d&#xff0c;问这一年的第d天是几月几日&#xff1f; 注意闰年的2月有29天&#xff0c;且满足下面条件之一的是闰年&#xff1a; 1&#xff09; 年份是4的整数倍&#xff0c;而且不是100的整数倍&#xff1b; 2&#xff09; 年份是…

至强 E5-2680 v4 攒机小记

缘何攒机 原有一台自用的 MacBook Pro 已用了5年左右&#xff0c;主要用来上网、处理文档和照片&#xff0c;日常使用率并不高。但自从主板坏了一次后就有了置办新设备的想法。笔记本、台式机、Mini主机都有考虑&#xff0c;一度几乎确定就是Mini主机了&#xff0c;主要看了零…

图扑物联助力打造现代化绿色智慧港口

“智慧港口”是以现代化基础设施设备为基础&#xff0c;以云计算、大数据、物联网、移动互联网、智能控制等新一代信息技术与港口运输业务深度融合为核心&#xff0c;以港口运输组织服务创新为动力&#xff0c;以完善的机制、法律法规、标准规范、发展政策为保障。能够在更高层…

RabbitMQ搭建集群环境、配置镜像集群、负载均衡

RabbitMQ集群搭建 Linux安装RabbitMQ下载安装基本操作命令开启管理界面及配置 RabbitMQ集群搭建确定rabbitmq安装目录启动第一个节点启动第二个节点停止命令创建集群查看集群集群管理 RabbitMQ镜像集群配置启用HA策略创建一个镜像队列测试镜像队列 负载均衡-HAProxy安装HAProxy…

dysmsapi

dysmsapi DY - SMS - API 短信服务接口 短信服务_SDK中心-阿里云OpenAPI开发者门户 <!-- 阿里dayu sms api短信群发接口 --><!-- https://mvnrepository.com/artifact/com.aliyun/dysmsapi20170525/2.0.24 --><dependency><groupId>com.aliyun&l…

SpringBoot上传图片文件到七牛云

准备工作 maven pom.xml添加七牛云的sdk依赖 <dependency><groupId>com.qiniu</groupId><artifactId>qiniu-java-sdk</artifactId><version>7.2.27</version></dependency>配置项 七牛云上传必要的配置有&#xff1a;acces…

escapeshellarg参数绕过和注入的问题

escapeshellcmd escapeshellcmd(string $command): string command--要转义的命令。 escapeshellcmd() 对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。 此函数保证用户输入的数据在传送到 exec() 或 system() 函数&#xff0c;或者 执行操作符 之前进行转义。 …

LVS-DR部署

目录 LVS的工作模式及其工作过程 NAT模式&#xff08;VS-NAT&#xff09; 直接路由模式&#xff08;VS-DR&#xff09; IP隧道模式&#xff08;VS-TUN&#xff09; DR模式 LVS负载均衡群集的分析及特点 数据包流向分析 DR 模式的特点 LVS-DR部署实例 LVS-DR模式部署流…

实验八 A/D模数转换(汇编与微机原理)

实验目的&#xff1a; 掌握ADC0809模数转换的工作原理。 掌握用ADC0809来进行电压转换的使用方法。 实验内容&#xff1a; 用模数转换器件ADC0809测量外部输入的模拟电压&#xff0c;将转换结果输出到数码管的最右边两位上显示。 实验原理&#xff1a; 0809A/D转换芯片有8…

18.XML

XML简介 • XML–可扩展标记语言 eXtensible Markup Language • 由W3C组织发布&#xff0c;目前推荐遵守的是W3C组织于2000年发布的XML1.0规范 • XML的使命&#xff0c;就是以一个统一的格式&#xff0c;组织有关系的数据&#xff0c;为不同平台下的应用程序服务 • XML用来…

Java并发(十九)----Monitor原理及Synchronized原理

1、Java 对象头 以 32 位虚拟机为例 普通对象 |--------------------------------------------------------------| | Object Header (64 bits) | |------------------------------------|-------------------------| | Mark W…

Python框架篇(5):FastApi-中间件使用

1.介绍 1.1 官网介绍 "中间件"是一个函数,它在每个请求被特定的路径操作处理之前,以及在每个响应返回之前工作. 它接收你的应用程序的每一个 请求. 然后它可以对这个 请求做一些事情或者执行任何需要的代码. 然后它将 请求传递给应用程序的其他部分 (通过某种 路径操…