超长String接收处理

简介: Java中字符串变量最大长度可达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];
}
理论上允许的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();

}

相关文章
|
8月前
|
人工智能 前端开发 API
Google发布50页AI Agent白皮书,老金帮你提炼10个核心要点
老金分享Google最新AI Agent指南:让AI从“动嘴”到“动手”。Agent=大脑(模型)+手(工具)+协调系统,可自主完成任务。通过ReAct模式、多Agent协作与RAG等技术,实现真正自动化。入门推荐LangChain,文末附开源知识库链接。
2942 119
|
3月前
|
人工智能 安全 Java
新一代 Java 基石:JDK 25 下载安装详细配置教程 附安装包
JDK 25 于2025年9月16日发布,是继JDK 21后的全新LTS长期支持版本,含18个JEP增强提案,全面升级语言语法、虚拟线程、GC、AI适配、安全与模块化,启动更快、内存更优,为企业级生产环境首选稳定版本。
1681 0
|
7月前
|
存储 监控 前端开发
Java大文件上传解决方案:分片上传+断点续传实战
大文件上传通常指上传超过几百MB甚至几个GB的文件。与普通文件上传相比,大文件上传面临以下挑战:一次性加载整个文件到内存会导致内存溢出,上传过程中网络中断需要能够断点续传。
448 2
|
5月前
|
Oracle Java 关系型数据库
【全网最详细】JDK25下载安装保姆级教程 | Java25环境变量配置图文步骤
JDK25是Oracle于2025年发布的Java技术预览版,非LTS版本。它在虚拟线程、模式匹配和内存管理方面显著优化,提升并发性能与开发效率。适合尝鲜与技术评估,生产环境建议选用JDK21或JDK17等LTS版本。
|
Java
记一个 Base64 有关的 Bug
了解一下,下一次用 Java 开发 Base64 有关的逻辑的时候注意绕过。
512 2
|
关系型数据库 MySQL Java
Failed to configure a DataSource: ‘url‘ attribute is not specified and no embedded datasource could
解决方法: 配置H2数据库或者MySQL数据库,其中配置MySQL解决方法如下: 1、添加 MySQL连接驱动的依赖 Maven工程在pom.xml中添加
3488 0
|
机器学习/深度学习 人工智能 算法
AI入门必读:Java实现常见AI算法及实际应用,有两下子!
本文全面介绍了人工智能(AI)的基础知识、操作教程、算法实现及其在实际项目中的应用。首先,从AI的概念出发,解释了AI如何使机器具备学习、思考、决策和交流的能力,并列举了日常生活中的常见应用场景,如手机助手、推荐系统、自动驾驶等。接着,详细介绍了AI在提高效率、增强用户体验、促进技术创新和解决复杂问题等方面的显著作用,同时展望了AI的未来发展趋势,包括自我学习能力的提升、人机协作的增强、伦理法规的完善以及行业垂直化应用的拓展等...
2559 3
AI入门必读:Java实现常见AI算法及实际应用,有两下子!
|
JavaScript IDE 开发工具
vue3【2024版】开发环境搭建(含官网和nvm下载切换最新版node,修改node下载源,创建项目,启动项目,安装vscode插件Vue - Official)
vue3【2024版】开发环境搭建(含官网和nvm下载切换最新版node,修改node下载源,创建项目,启动项目,安装vscode插件Vue - Official)
2466 3
sa-token 路由拦截式鉴权
sa-token 路由拦截式鉴权
1081 0
|
XML Java 应用服务中间件
1、SpringBoot2.0项目在IEDA中创建-超详细(一)
SpringBoot的功能 用来简化新Spring应用的初始搭建以及开发过程。
396 0
1、SpringBoot2.0项目在IEDA中创建-超详细(一)

热门文章

最新文章