超长String接收处理

简介: 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();

}

相关文章
|
25天前
|
XML 算法 安全
详解RAG五种分块策略,技术原理、优劣对比与场景选型之道
RAG通过检索与生成结合,提升大模型在企业场景的准确性与可控性。分块策略是其核心,直接影响检索效果与生成质量。本文系统解析五种主流分块方法:固定大小、语义、递归、基于结构及LLM分块,对比其优缺点与适用场景,并提出组合优化建议,助力构建高效、可信的RAG系统。
90 0
|
25天前
|
SQL 缓存 Java
汇总
MyBatis配置优先级:方法参数 &gt; resource/url &gt; properties体内。支持多环境、事务管理(JDBC/MANAGED)、XML映射(一对一、一对多、多对多)及分页(逻辑与物理)。提供一级、二级缓存,三种执行器,支持拦截器扩展与批量操作优化。
|
25天前
|
监控 安全 Unix
iOS 崩溃排查不再靠猜!这份分层捕获指南请收好
从 Mach 内核异常到 NSException,从堆栈遍历到僵尸对象检测,阿里云 RUM iOS SDK 基于 KSCrash 构建了一套完整、异步安全、生产可用的崩溃捕获体系,让每一个线上崩溃都能被精准定位。
499 64
|
25天前
|
存储 算法 BI
xxljob本地运行
本文介绍XXL-JOB分布式任务调度的部署与使用。包含源码获取、数据库导入、服务端配置启动、客户端注册及执行器配置。详细说明各数据表作用、路由策略类型,并演示任务创建、参数设置与执行日志查看,助你快速上手XXL-JOB。
|
25天前
|
网络协议 安全 应用服务中间件
阿里云 SSL 证书申请全流程:新手也能看懂的图文教程
不管是个人做网站测试,还是企业刚起步需要给网站加安全防护,SSL 证书都是必不可少的 —— 它能让网站从 “http” 变成 “https”,浏览器地址栏会显示小绿锁,访客看着更放心,数据传输也更安全。阿里云提供了不同类型的 SSL 证书,其中免费的个人测试证书适合新手入门,下面就用通俗易懂的语言,一步步教你怎么申请、验证和下载,就算是第一次操作也能跟着做。
|
25天前
|
存储 安全 Java
Java泛型类型擦除以及类型擦除带来的问题
Java泛型在编译时会进行类型擦除,所有泛型信息被移除,替换为原始类型(如Object或限定类型)。这导致List&lt;String&gt;和List&lt;Integer&gt;在运行时等价于List,引发反射可插入不兼容类型等问题。同时,泛型不支持基本数据类型、静态上下文中使用受限,且instanceof无法用于泛型类型判断。编译器通过桥接方法等机制解决多态冲突,并在获取元素时自动插入类型转换,保证类型安全。
|
25天前
|
NoSQL Linux Shell
2-MongoDB单机部署
本文详细介绍MongoDB在Windows和Linux系统中的安装、配置与启动方法,包括下载地址、版本选择、解压安装、命令行及配置文件启动方式,并介绍Shell连接、图形化工具Compass的使用,以及Linux下的部署、防火墙设置和安全关闭服务等操作步骤。
 2-MongoDB单机部署
|
26天前
|
关系型数据库 MySQL Java
开发环境搭建
工欲善其事,必先利其器。学习前请确保电脑内存16G以上(建议32G),推荐使用便携显示器分屏开发。需安装VMware虚拟机并导入CentOS 7系统(IP:192.168.101.68),配置IDEA、Maven、Git环境,拉取Gitee项目代码,创建数据库并导入SQL。苹果用户需用Docker安装MySQL。
37 0
开发环境搭建
|
25天前
|
Java 应用服务中间件 网络安全
Eclipse运行SSM/SSH项目教程
本教程介绍如何在Eclipse中配置并运行Java Web项目。涵盖JDK、Tomcat环境搭建,项目导入(支持Maven与非Maven),Eclipse中绑定Tomcat服务器及项目部署步骤。提供常见问题解决方案,如数据库连接配置错误等,助你快速启动并访问项目。
|
25天前
|
存储 NoSQL 关系型数据库
 1-MongoDB相关概念
MongoDB是一款高性能、无模式的文档型数据库,适用于高并发、海量数据、高扩展性场景。适用于社交、游戏、物流、物联网等写入频繁、事务要求不高的应用。支持BSON格式,灵活存储复杂数据,提供丰富查询、索引、分片和副本集功能,具备高可用与水平扩展能力,是Web2.0及大数据时代的理想选择。(238字)