超长String接收处理

本文涉及的产品
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
简介: Java中String变量最大长度为Integer.MAX_VALUE,但字符串字面量受class文件格式限制,最大65534。超过会编译错误,需通过StringBuilder分组处理长字符串。

1 背景String内部是以char数组的形式存储,数组的长度是int类型,那么String允许的最大长度就是Integer.MAX_VALUE了。又由于java中的字符是以16位存储的,因此大概需要4GB的内存才能存储最大长度的字符串。不过这仅仅是对字符串变量而言,如果是字符串字面量(string literals),如“abc"、"1a2b"之类写在代码中的字符串literals,那么允许的最大长度取决于字符串在常量池中的存储大小,也就是字符串在class格式文件中的存储格式:

Java

运行代码复制代码

CONSTANT_Utf8_info {

   u1 tag;

   u2 length;

   u1 bytes[length];

}


CONSTANT_Utf8_info {

u1 tag;

u2 length;

u1 bytes[length];

}

理论上允许的string literal的最大长度是2^16-1=65535。然而实际测试表明,允许的最大长度仅为65534,超过就编译错误了。2 问题描述问题的关键就在于,不管从Http还是RPC等协议中,我们都没办法直接用字符串字面量去直接接收,即:String result = ****,因为这样会直接报错:常量字符串过长所以需要将数据进行分组处理3 解决方案

Java

运行代码复制代码

private String getOutOfMaxLengthStr() {

 

   StringBuilder sb = new StringBuilder();

   sb.append("65535长度字符串");

   sb.append("65578长度字符串");

 

   json.put("test", sb.toString());

 

   // 总字符串长度

   int length = json.get("test").toString().length();

 

   // 整数组

   int size = length / 65534;

 

   // 最后一组起始脚标

   int lastLength = (65534 * size);

 

   // 分组追加

   StringBuilder sbuffer = new StringBuilder();

   for (int i = 0; i < size; i++) {

       String str = json.get("test").toString().substring(65534 * i, 65534 * (i + 1));

       sbuffer.append(str);

   }

 

   // 最后一组

   String lastStr = json.get("test").toString().substring(lastLength, length);

   sbuffer.append(lastStr);

 

   return sbuffer.toString();

}


private String getOutOfMaxLengthStr() {

StringBuilder sb = new StringBuilder();

sb.append("65535长度字符串");

sb.append("65578长度字符串");

json.put("test", sb.toString());

// 总字符串长度

int length = json.get("test").toString().length();

// 整数组

int size = length / 65534;

// 最后一组起始脚标

int lastLength = (65534 * size);

// 分组追加

StringBuilder sbuffer = new StringBuilder();

for (int i = 0; i < size; i++) {

String str = json.get("test").toString().substring(65534 * i, 65534 * (i + 1));

sbuffer.append(str);

}

// 最后一组

String lastStr = json.get("test").toString().substring(lastLength, length);

sbuffer.append(lastStr);

return sbuffer.toString();

}

相关文章
|
存储 Kubernetes 负载均衡
基于青云LB搭建高可用的k8s集群。
本文是青云LB(负载均衡)与k8s实战(一)的详细篇,是在青云上,利用青云LB搭建高可用的k8s集群的过程中遇到的各种问题的梳理和总结。
874 1
|
6月前
|
XML 算法 安全
详解RAG五种分块策略,技术原理、优劣对比与场景选型之道
RAG通过检索与生成结合,提升大模型在企业场景的准确性与可控性。分块策略是其核心,直接影响检索效果与生成质量。本文系统解析五种主流分块方法:固定大小、语义、递归、基于结构及LLM分块,对比其优缺点与适用场景,并提出组合优化建议,助力构建高效、可信的RAG系统。
305 0
|
6月前
|
数据采集 领域建模 数据库
领域模型图(数据架构/ER图)
本文介绍通过四色原型法构建领域模型并生成ER图的过程。运用MI(时标)、PPT(参与方-地点-物品)、Role(角色)和DESC(描述)四种原型,逐步抽象风控系统的业务流程,提炼实体与关系,最终形成数据架构中的ER图,为数据库设计提供基础支撑。(238字)
|
7月前
|
存储 弹性计算 API
阿里云服务器带宽值多大合适?公网带宽多少M够用?
阿里云服务器带宽选择需根据实际场景:轻量应用选1-5M,中小型网站/API建议5-20M,视频、大文件下载等高并发业务建议50M以上。可结合CDN、OSS、弹性公网EIP和共享带宽降低成本,提升性能。
1269 155
|
6月前
|
Java Shell 测试技术
Jmeter快速入门
本文介绍JMeter的安装与快速入门,包括下载、解压、运行步骤,以及中文语言设置和基本使用方法,帮助用户快速上手性能测试工具JMeter。
|
6月前
|
canal 缓存 关系型数据库
微服务阶段原理篇
本文介绍了电商系统中ES索引与MySQL数据同步的解决方案,重点阐述了基于Canal和MQ的异步同步机制。通过解析MySQL的binlog日志,Canal实现数据变更的实时捕获,并结合RabbitMQ保证消息顺序性,最终实现Elasticsearch索引的高效更新。该方案解耦了业务逻辑与索引维护,提升了系统性能与一致性。
 微服务阶段原理篇
|
6月前
|
存储 关系型数据库 MySQL
微服务原理篇(XXLJOB-幂等-MySQL)
本文介绍了XXL-JOB任务调度的优势、组成结构及热点商品缓存更新任务的实现,涵盖幂等性概念与解决方案,并深入解析了MySQL存储引擎特性、索引失效场景、回表与覆盖索引原理以及SQL调优和分库分表策略。
318 0
微服务原理篇(XXLJOB-幂等-MySQL)
|
6月前
|
存储 算法 BI
xxljob本地运行
本文介绍XXL-JOB分布式任务调度的部署与使用。包含源码获取、数据库导入、服务端配置启动、客户端注册及执行器配置。详细说明各数据表作用、路由策略类型,并演示任务创建、参数设置与执行日志查看,助你快速上手XXL-JOB。
|
数据采集 监控 搜索推荐
基于python的百度资讯爬虫的设计与实现
本文介绍了一个基于Python语言的网络爬虫设计与实现,该爬虫利用urllib.request和BeautifulSoup库从百度新闻中抓取新闻标题、链接、内容摘要和来源信息,通过模拟浏览器行为和添加随机等待时间来规避反爬机制,为新闻数据分析和舆情监控提供支持。
1156 2
|
SQL 关系型数据库 MySQL
mybatisPlus之自动填充功能及防全表更新与删除插件
mybatisPlus之自动填充功能及防全表更新与删除插件

热门文章

最新文章