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

}

相关文章
|
26天前
Watcher机制(一)
本文深入分析Zookeeper的Watcher机制,涵盖核心类与源码实现。重点解析Watcher、Event、WatchedEvent等接口与类,梳理其内部结构及事件通知流程,帮助理解Zookeeper的数据变更监听原理。
41 0
Watcher机制(一)
|
25天前
|
人工智能 机器人 Java
黑马最新项目
AIGC项目涵盖大模型私有化部署、聊天机器人、RAG知识库及代码提示工具;天机AI集成SpringAI与多模型工作流;云岚到家聚焦微服务与分布式架构;四方保险构建统一支付与时序数据应用;星辰WMS与Dify项目即将发布。
80 0
黑马最新项目
|
26天前
|
存储 关系型数据库 MySQL
微服务原理篇(XXLJOB-幂等-MySQL)
本文介绍了XXL-JOB任务调度的优势、组成结构及热点商品缓存更新任务的实现,涵盖幂等性概念与解决方案,并深入解析了MySQL存储引擎特性、索引失效场景、回表与覆盖索引原理以及SQL调优和分库分表策略。
31 0
微服务原理篇(XXLJOB-幂等-MySQL)
|
26天前
|
canal 缓存 关系型数据库
微服务原理篇(Canal-Redis)
本文介绍了ES索引同步的常见方案,重点讲解Canal+MQ数据同步机制。通过解析MySQL的binlog日志,Canal模拟slave伪装接入主库,实现增量数据捕获,并结合RabbitMQ保证消息顺序性地同步至Elasticsearch。同时探讨了缓存一致性问题,提出使用分布式锁(如Redis)控制并发写操作,避免双写不一致。还涵盖Redis持久化、集群模式、过期淘汰策略及缓存三剑客(穿透、雪崩、击穿)的解决方案,系统梳理了高并发场景下的数据同步与缓存保障技术体系。
56 0
 微服务原理篇(Canal-Redis)
|
26天前
|
存储 搜索推荐 数据库
ES分布式搜索引擎入门
本课程介绍Elasticsearch的核心概念与应用,涵盖倒排索引原理、IK分词器使用、Java Client操作索引及查询等技能,帮助学员掌握高效搜索功能开发,适用于电商等高并发场景。
67 0
ES分布式搜索引擎入门
|
26天前
|
消息中间件 Java 数据安全/隐私保护
异步消息组件MQ基础
本课程学习RabbitMQ在微服务中的应用,涵盖MQ的应用场景、异步与同步调用区别、RabbitMQ的安装与配置、消息收发入门、工作队列模型及交换机类型(Fanout、Direct、Topic)等核心知识,并结合SpringAMQP实现消息通信与项目实战。
38 0
异步消息组件MQ基础
|
26天前
|
负载均衡 Java 应用服务中间件
微服务网关与配置中心 学习目标
本课程学习Spring Cloud Gateway网关的实现,掌握路由配置、负载均衡、内置过滤器(如StripPrefix)及全局过滤器的使用。重点包括自定义身份校验过滤器、JWT鉴权流程、微服务间用户信息传递,并结合Nacos实现服务发现与统一配置管理,完成前后端联调与权限控制。
51 0
微服务网关与配置中心 学习目标
|
26天前
|
Java 应用服务中间件 Sentinel
服务保护、分布式事务
本课程讲解微服务保护核心知识,涵盖雪崩问题、熔断降级、限流隔离等方案,学习Sentinel实现熔断限流,掌握FallbackFactory降级处理及Seata分布式事务原理与应用。
25 0
服务保护、分布式事务
|
25天前
|
负载均衡 算法 Dubbo
LoadBalance
本文深入解析Dubbo集群容错中的四大负载均衡算法:随机、轮询、最少活跃数与一致性哈希。结合数学分析与流程图,通俗讲解每种算法的实现原理与适用场景,重点剖析权重设计、活跃数统计及虚拟节点等核心机制,帮助理解源码背后的思维逻辑,并回应常见面试题。
33 0
|
25天前
|
存储 Java
Zookeeper序列化
本文从源码角度解析Zookeeper的序列化机制,重点分析jute包中的InputArchive和OutputArchive接口及其实现类,涵盖基本类型的读写、记录、向量与Map的序列化与反序列化过程,揭示其在网络通信与数据存储中的核心作用。
11 0