StringUtil

简介: 111

超长String接收处理

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


相关文章
|
Python
【python】通过多线程解决tkinter gui中按键卡住的问题
【python】通过多线程解决tkinter gui中按键卡住的问题
572 0
|
NoSQL Redis 数据安全/隐私保护
在 Docker 中部署 Redis 并挂载配置文件
在 Docker 中部署 Redis 并挂载配置文件
|
3月前
|
安全 Go Windows
Goland 解决在windows上 Cannot run program “D:\atool\goexe\myApp.exe 无法进行正常调试问题
GoLand运行Go程序时遇“应用程序控制策略已阻止此文件”错误,主因是Windows安全机制拦截未签名的.exe。推荐两法:①右键属性→勾选“解除锁定”;②用gops关联已启动进程调试,彻底绕过拦截。(239字)
637 4
Goland 解决在windows上 Cannot run program “D:\atool\goexe\myApp.exe 无法进行正常调试问题
|
2月前
|
人工智能 安全 Java
OpenClaw 与飞书集成教程:企业IM对接全流程详解
本文详解OpenClaw与飞书集成全流程:涵盖飞书开放平台凭证获取(App ID/Secret)、OpenClaw后台配置及常见异常排查,步骤清晰、安全可靠,助力企业快速实现AI服务与IM办公无缝融合,提升协作效率。
|
6月前
|
SQL 存储 关系型数据库
MySQL 高频面试题
本课程深度解析阿里MySQL高频面试题,涵盖底层原理、索引优化、性能调优与故障排查四大核心模块。结合阿里实战场景,精讲MVCC、B+树、事务ACID、死锁处理、慢SQL定位、分库分表等关键技术点,提供可落地的优化方案与标准答案,助力掌握“原理+实战”双能力,精准应对高并发、大数据量下的数据库挑战,适合中高级开发者冲击大厂offer。
|
8月前
|
人工智能 数据可视化 数据安全/隐私保护
AiPy定义智能财务分析,让数据说话!
看懂财报不只是看数据,更是读出背后的“故事”。以茅台2024年财报为例,AiPy智能分析揭示其高毛利、强净利与低负债背后的竞争优势,从高端酒战略到全链条效率,几分钟完成专业级洞察。
|
人工智能 自然语言处理 数据可视化
大模型+BI:一场关乎企业未来生死的数据智能卡位战 | 【瓴羊数据荟】数据MeetUp第四期
随着大模型技术突破,全球企业迎来数据智能革命。Gartner预测,到2027年,中国80%的企业将采用多模型生成式AI策略。然而,数据孤岛与高门槛仍阻碍价值释放。
805 8
大模型+BI:一场关乎企业未来生死的数据智能卡位战 | 【瓴羊数据荟】数据MeetUp第四期
|
机器学习/深度学习 人工智能 自然语言处理
人工智能与艺术创作:机器与创造力
【10月更文挑战第31天】本文探讨了人工智能在艺术创作中的应用,涵盖绘画、音乐和文学等领域。通过深度学习、生成模型和强化学习等技术,AI正重新定义创造力的概念,辅助艺术家创作,并激发新的艺术形式。文章还讨论了AI对人类创造力的影响及未来发展趋势。
|
设计模式 Java Maven
Springboot Starter 是如何工作的?
本文详细介绍Springboot Starter的实现原理、设计思想及其优缺点。Springboot Starter通过Maven或Gradle依赖管理引入相关依赖,并利用自动配置和条件注解简化开发流程。文章通过示例展示了如何创建自定义Starter,并分析了其模块化设计、约定优于配置、自动配置、依赖注入、开闭原则及单一职责原则等设计理念。尽管Starter带来诸多便利,但也存在黑盒操作、过度依赖及启动时间增加等问题。通过本文,你将全面了解Springboot Starter的工作机制与应用场景。
598 3
|
开发框架 Dart JavaScript
深入探讨Flutter中的Web支持功能,以及如何利用Flutter构建跨平台Web应用的最佳实践
【6月更文挑战第11天】Flutter,Google的开源跨平台框架,已延伸至Web支持,让开发者能用同一代码库构建移动和Web应用。Flutter Web基于Dart转JavaScript,利用WebAssembly和JavaScript在Web上运行。构建Web应用最佳实践包括选择合适项目、优化性能、进行兼容性测试和利用Flutter的声明式UI、热重载等优势。尽管性能挑战存在,Flutter Web为跨平台开发提供了更多机会和潜力。
590 1