超长String接收处理

简介: 111

1 背景

String内部是以char数组的形式存储,数组的长度是int类型,那么String允许的最大长度就是Integer.MAX_VALUE了。又由于java中的字符是以16位存储的,因此大概需要4GB的内存才能存储最大长度的字符串。不过这仅仅是对字符串变量而言

如果是字符串字面量(string literals),如“abc"、"1a2b"之类写在代码中的字符串literals,那么允许的最大长度取决于字符串在常量池中的存储大小,也就是字符串在class格式文件中的存储格式:

CONSTANT_Utf8_info {
    u1 tag;
    u2 length;
    u1 bytes[length];
}

理论上允许的string literal的最大长度是2^16-1=65535。然而实际测试表明,允许的最大长度仅为65534,超过就编译错误了。

2 问题描述

问题的关键就在于,不管从Http还是RPC等协议中,我们都没办法直接用字符串字面量去直接接收,即:

String result = ****,因为这样会直接报错:常量字符串过长

所以需要将数据进行分组处理

3 解决方案

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


相关文章
|
机器学习/深度学习 SQL 分布式计算
Spark核心原理与应用场景解析:面试经验与必备知识点解析
本文深入探讨Spark核心原理(RDD、DAG、内存计算、容错机制)和生态系统(Spark SQL、MLlib、Streaming),并分析其在大规模数据处理、机器学习及实时流处理中的应用。通过代码示例展示DataFrame操作,帮助读者准备面试,同时强调结合个人经验、行业趋势和技术发展以展现全面的技术实力。
1616 0
|
3月前
|
前端开发 Java API
Spring Boot 整合 x-easypdf:5 分钟搞定 PDF 生成与中文排版
在 Java 开发中,生成 PDF 文档常面临中文乱码、排版困难、依赖库收费等痛点。本文推荐一款基于 PDFBox 深度封装的国产开源神器 —— x-easypdf。它内置中文字体,API 简洁易用,支持组件化开发。本文将通过一个“企业录用通知书生成器”的实战 Demo,带你体验 5 分钟快速实现 PDF 生成的全过程。
699 1
|
消息中间件 存储 负载均衡
|
1月前
|
人工智能 自然语言处理 API
OpenClaw 龙虾AI智能客服终极方案:阿里云/本地+RAGFlow企业级搭建+大模型API配置,效率起飞!
2026年,企业智能客服已经从简单问答转向**精准知识库检索+多轮对话+自动化执行**的综合场景。OpenClaw(Clawdbot)凭借轻量化、易扩展、支持企业微信与飞书接入的优势,成为智能体客服的首选框架;而RAGFlow作为稳定易用的开源RAG引擎,能够快速构建私有知识库,实现文档自动解析、分段、向量化与精准检索。二者结合,可打造出**回答准确、不编造、可追溯、可训练**的企业级智能客服,大幅降低人工成本、提升响应速度与服务质量。
1215 0
|
开发框架 前端开发 JavaScript
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(12) -- 使用代码生成工具Database2Sharp生成WPF界面代码
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(12) -- 使用代码生成工具Database2Sharp生成WPF界面代码
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(12) -- 使用代码生成工具Database2Sharp生成WPF界面代码
|
Unix Shell Linux
在Linux中,什么是Bash脚本,并且如何使用它。
在Linux中,什么是Bash脚本,并且如何使用它。
|
存储 NoSQL Redis
RedisTemplate常用方法总结
RedisTemplate常用方法总结
674 0
|
XML 数据格式
restTemplat发post请求报错Content type ‘application/xml;charset=UTF-8‘ not supported“
restTemplat发post请求报错Content type ‘application/xml;charset=UTF-8‘ not supported“
759 1
若依修改标题和icon,在vue.config.js和.env.development进行修改
若依修改标题和icon,在vue.config.js和.env.development进行修改
|
JavaScript
vue3使用element-plus 树组件(el-tree)数据回显
vue3使用element-plus 树组件(el-tree)数据回显
1408 0

热门文章

最新文章