【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.mzph.cn/news/229052.shtml

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

相关文章

设计可编辑表格组件

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

ReenterLock重入锁

synchronized就是一种最简单的控制方法&#xff0c;它决定了一个线程释放可以访问临界区资源。 同时&#xff0c;Object.wait()方法和Object.notify()方法起到了线程等待和通知的作用。 ReenterLock重入锁可以完全替代关键字Synchoronized.重入锁是Synchoronized、Object.wait(…

CAPL基础语法

目录 1.变量的声明与定义1.1变量名1.2全局变量与局部变量全局变量局部变量1.3简单变量1.4复合类型结构 struct枚举 enum数组 Array1.5特殊类型报文诊断报文定时器1.变量的声明与定义 在程序运行过程中,其值可以被改变的量称为变量。变量可以用于保存用户输入的数据,也可以保…

[楚慧杯 2023] web

文章目录 eaaevalupload_shell eaaeval 打开题目&#xff0c;源码给了用户密码 登陆后啥也没有&#xff0c;扫一下发现源码泄露www.zip <?php class Flag{public $a;public $b;public function __construct(){$this->a admin;$this->b admin;}public function _…

实验四: 语义分析与中间代码生成

一、实验目的 通过上机实习,加深对语法制导翻译原理的理解,掌握将语法分析所识别的语法成分变换为中间代码的语义翻译方法. 二、实验内容 采用递归下降语法制导翻译法,对算术表达式、赋值语句进行语义分析并生成四元式序列。 三实验要求 实验要求 文法&#xff1a;statem…

C++ list常用操作

目录 一、介绍 二、list的常用操作 1、构造 2、迭代器 3、元素访问 4、容量操作 一、介绍 std::list文档链接 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是双向链表结构&#xff0c;双向链表中每个…

3rd 库(x86, linux)的编译,源码目录

著名的C/C框架和第三方库-CSDN博客 Ubuntu下protobuf的port_def.inc文件找不到问题//test ok-CSDN博客 protobuf入门教程(四)&#xff1a;repeated限定修饰符//test ok-CSDN博客 protobuf 3.17.0交叉编译//test ok-CSDN博客 protobuf-2.6.1安装//test ok-CSDN博客 【zmq】z…

独立看门狗 IWDG

看门狗介绍 "看门狗"通常指的是计算机科学和信息技术领域中的一种技术或设备&#xff0c;用于监控系统的运行状态&#xff0c;并在系统出现故障或异常情况时采取相应的措施。这种技术或设备起到类似于守卫的作用&#xff0c;确保系统的稳定性和可靠性。 在计算机系统…

RealBasicVSR高清处理视频

autodl做了镜像&#xff1a;高清RealBasicVSR 首先在剪映将视频剪好导出&#xff0c;最多是720像素的&#xff0c;不然后面超分的时候会爆显存。剪映视频也最好是双数帧数结尾的&#xff0c;不然超分的时候单数图片会报错->RuntimeError: non-empty 3D or 4D input tensor …

beebox靶场A1 low 命令注入通关教程(上)

一&#xff1a;html注入 get HTML注入&#xff0c;就是当用户进行输入时&#xff0c;服务器没有对用户输入的数据进行过滤或转义&#xff0c;导致所有输入均被返回前端&#xff0c;网页解析器会将这些数据当作html代码进行解析,这就导致一些恶意代码会被正常执行。 首先进行简…

DC电源模块的设计与制造技术创新

BOSHIDA DC电源模块的设计与制造技术创新 DC电源模块的设计与制造技术创新主要涉及以下几个方面&#xff1a; 1. 高效率设计&#xff1a;传统的DC电源模块存在能量转换损耗较大的问题&#xff0c;技术创新可通过采用高效率的电路拓扑结构、使用高性能的功率开关器件和优化控制…

【Linux应用编程笔记】输入设备

系列文章目录 【Linux应用编程笔记】GPIO 本系列使用的开发板为正点原子阿尔法IMX6ULL开发板&#xff0c;及根据正点原子所的提供教程学习 文章目录 系列文章目录【Linux应用编程笔记】GPIO 做什么&#xff1f;一、编写流程1、input子系统2、读取数据的流程3、解析数据应用编…

面向对象三大特征——继承

目录 1. 概述 2. 继承的限制 2.1 单继承 2.2 访问修饰符 2.3 . final 3. 重写 4. super 4.1super的作用 4.2访问父类的成员和被重写方法 4.3调用父类的构造器 1. 概述 多个类中存在相同属性和行为时&#xff0c;将这些内容抽取到单独一个类中&#xff0c;那么就无需在…

C++类与对象 (上)

目录 前言&#xff1a; 类和对象的理解 类的引入 类的定义与使用方式 访问限定符 类的两种定义方式 成员变量的命名规则 类的作用域 类的实例化 类对象模型 计算类对象的大小 类对象的存储方式 this指针 前言&#xff1a; C语言是面向过程的&#xff0c;关注的是过…

基于Java SSM框架实现智能停车场系统项目【项目源码+论文说明】

基于java的SSM框架实现智能停车场系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个智能停车场管理系统&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述…

svg文本转为对应图片的base64编码

转换脚本&#xff08;node&#xff09; npm init -y npm install express sharp body-parser const express require(express); const bodyParser require(body-parser); const sharp require(sharp);const app express(); const port 5000;// 配置body-parser以接受JSON格…

【Linux基础命令使用】

文章目录 一. 操作系统和文件及文件路径介绍二. 基础指令介绍三. 结束语 一. 操作系统和文件及文件路径介绍 什么是操作系统&#xff1f;操作系统是一款进行软硬件资源管理的软件为什么要进行软硬件资源管理&#xff1f;对上提供良好的稳定的运行服务----工具Linux指令和图形化…

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

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

数字签名介绍

数字签名的意义&#xff1a;防止抵赖、保证信息没有被更改过。 假如A公司要发一份合同给B公司&#xff0c;过程如下&#xff1a; 1 A公司使用一个单向散列函数算法&#xff08;比如使用MD5&#xff09;对合同计算一个摘要&#xff0c;得到摘要S(A)&#xff0c;再使用A的私钥对摘…

信息学奥赛一本通1085:球弹跳高度的计算详解+代码

目录 题目 【题目描述】 【输入】 【输出】 【输入样例】 【输出样例】 详解 代码 题目链接&#xff1a;信息学奥赛一本通1085&#xff1a;球弹跳高度的计算 题目 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 100308 通过数: 55941 【题目描述】 一球…