StringUtil

简介: Java中字符串最大长度受限于虚拟机规范,字符串字面量在class文件中存储时最大为65534,超长需分段处理。本文介绍通过StringBuilder分组拼接解决超长字符串接收问题的方法。

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

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();

}


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();

}

相关文章
|
2月前
|
人工智能 机器人 Java
黑马最新项目
AIGC项目涵盖大模型私有化部署、聊天机器人、RAG知识库及代码提示工具;天机AI集成SpringAI与多模型工作流;云岚到家聚焦微服务与分布式架构;四方保险构建统一支付与时序数据应用;星辰WMS与Dify项目即将发布。
109 0
黑马最新项目
|
2月前
|
canal 缓存 关系型数据库
微服务原理篇(Canal-Redis)
本文介绍了ES索引同步的常见方案,重点讲解Canal+MQ数据同步机制。通过解析MySQL的binlog日志,Canal模拟slave伪装接入主库,实现增量数据捕获,并结合RabbitMQ保证消息顺序性地同步至Elasticsearch。同时探讨了缓存一致性问题,提出使用分布式锁(如Redis)控制并发写操作,避免双写不一致。还涵盖Redis持久化、集群模式、过期淘汰策略及缓存三剑客(穿透、雪崩、击穿)的解决方案,系统梳理了高并发场景下的数据同步与缓存保障技术体系。
88 0
 微服务原理篇(Canal-Redis)
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
大模型专业名词解释手册
本手册由油炸小波设计提示词、Manus创作,系统梳理大语言模型核心概念,涵盖基础原理、训练技术、优化压缩、推理应用、评估调试及伦理安全六大模块,深入浅出解析LLM关键技术术语。
292 0
|
2月前
|
Arthas 存储 运维
记Arthas实现一次CPU排查与代码热更新
本文介绍使用Arthas排查Java应用CPU占用过高问题的完整流程,涵盖线程分析、阻塞定位、watch命令追踪异常、jad反编译实现热更新及火焰图分析,实现无需重启应用的高效故障排查与代码修复。
91 0
|
2月前
|
缓存
QLExpress使用及源码分析
本文介绍基于QLExpress的规则引擎实现方案,涵盖实体构建、接口定义与脚本编写。通过@QLAlias注解映射字段别名,结合YAML配置规则表达式,实现逻辑解耦。运行时动态解析AST语法树,支持汉化变量与上下文绑定,并提供缓存与延迟执行机制,提升性能与灵活性。
57 0
QLExpress使用及源码分析
|
2月前
|
消息中间件 Java 数据安全/隐私保护
异步消息组件MQ基础
本课程学习RabbitMQ在微服务中的应用,涵盖MQ的应用场景、异步与同步调用区别、RabbitMQ的安装与配置、消息收发入门、工作队列模型及交换机类型(Fanout、Direct、Topic)等核心知识,并结合SpringAMQP实现消息通信与项目实战。
52 0
异步消息组件MQ基础
|
2月前
|
负载均衡 Java 应用服务中间件
微服务网关与配置中心 学习目标
本课程学习Spring Cloud Gateway网关的实现,掌握路由配置、负载均衡、内置过滤器(如StripPrefix)及全局过滤器的使用。重点包括自定义身份校验过滤器、JWT鉴权流程、微服务间用户信息传递,并结合Nacos实现服务发现与统一配置管理,完成前后端联调与权限控制。
67 0
微服务网关与配置中心 学习目标
|
2月前
|
Java 应用服务中间件 Sentinel
服务保护、分布式事务
本课程讲解微服务保护核心知识,涵盖雪崩问题、熔断降级、限流隔离等方案,学习Sentinel实现熔断限流,掌握FallbackFactory降级处理及Seata分布式事务原理与应用。
36 0
服务保护、分布式事务
|
2月前
|
人工智能 NoSQL 前端开发
面试真题
汇总多套AI与后端技术面试题,涵盖RAG、微服务、JVM、分布式锁、MySQL优化、大模型部署等核心技术点,深入考察候选人项目经验、系统设计能力及对AI工程化的理解。
134 0
|
2月前
|
安全 Java 网络安全
HTTP工具
本文介绍了Java中通过HttpClient发送HTTP/HTTPS的GET和POST请求,并在请求头中添加AppKey和Secret的方法,包含设置超时参数、SSL安全连接及资源释放的完整实现,适用于安全通信场景。
80 0