超长String接收处理

简介: Java中字符串变量最大长度可达Integer.MAX_VALUE,但字符串字面量受class文件格式限制,理论最大65535,实际仅支持65534。超出将编译失败。对于超长字符串,需通过StringBuilder分组拼接处理,避免常量池溢出。

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

}

目录
相关文章
|
2天前
|
敏捷开发 Dubbo Java
微服务技术栈
本文介绍敏捷开发中需求人日评估方法,涵盖开发、自测、联调、测试及发布各阶段周期估算,并提供常见功能如增删改查、导入导出、远程调用等参考人日,助力团队科学排期。
35 15
|
2天前
|
Java 测试技术 Linux
微服务技术栈
本文介绍大型团队中生产环境发布管理的全流程,涵盖从开发到生产的多环境部署策略(dev→test→pre→prod),结合自动化CI/CD平台实现分支管理、一键发布与回滚。通过Jenkins+K8S+Docker实现构建部署自动化,各环境隔离运行;日志排查依托Skywalking或ELK实现链路追踪,提升故障定位效率,保障发布稳定性与系统可靠性。
34 7
|
1天前
|
存储 NoSQL 关系型数据库
MongoDB相关概念
MongoDB是一款高性能、无模式的文档型NoSQL数据库,适用于高并发、海量数据、高扩展性场景。适用于社交、游戏、物联网、物流、视频直播等应用,擅长处理数据量大、读写频繁、事务要求不高的业务。支持BSON格式,灵活存储复杂数据,提供丰富查询、索引、分片和副本集功能,实现高效读写与水平扩展,相比MySQL可大幅降低开发运维成本。
9 0
|
1天前
|
网络协议 关系型数据库 MySQL
nexus搭建docker私仓 使用nexus创建docker私有仓库
本文介绍如何使用Nexus搭建Docker私有仓库,包括Nexus中启用Docker仓库、创建Blob存储、配置docker-hosted仓库及端口设置,并说明防火墙开放与Docker客户端配置insecure-registry的方法,实现镜像的推送与拉取。
16 0
|
1天前
|
安全 Linux Shell
Docker镜像
镜像是包含软件运行所需代码、依赖库、配置等的轻量级可执行包。Docker利用联合文件系统实现分层结构,通过bootfs和rootfs构成镜像底层,支持镜像共享与复用。容器启动时在镜像顶层添加可写容器层,所有修改仅作用于该层,保障镜像安全与高效。
13 0
|
1天前
脱敏工具
提供身份证、姓名、手机号脱敏方法:身份证保留前后部分,中间替换为*;姓名仅显示首尾字符,中间隐去;手机号保留前3后4位,中间4位隐藏,保护用户隐私。
2 0
|
1天前
|
关系型数据库 MySQL Linux
Docker下载加速
通过配置网易数帆、阿里云镜像加速器或Docker代理,可显著提升Docker镜像下载速度。推荐使用阿里云加速器,配置简单,支持官方镜像标签;也可结合代理实现更高效拉取。
5 0
|
1天前
|
缓存 Ubuntu Linux
Docker安装
本文介绍在CentOS系统上安装Docker的完整步骤,包括卸载旧版本、配置阿里云镜像源、安装最新或指定版本的Docker引擎,并启动服务。同时涵盖Ubuntu系统的安装方法及离线安装方式,支持配置系统服务、daemon.json参数、日志管理与命令补全,最后通过`hello-world`验证安装成功。
11 0
|
1天前
|
Linux Go 虚拟化
Docker概述
Docker是基于Go语言的开源容器化平台,实现“一次镜像,处处运行”。它将应用及依赖打包到轻量级、可移植的容器中,直接利用宿主机内核,启动快、资源占用少,支持秒级启动、单机千级容器部署,显著优于传统虚拟机。核心组件包括镜像、容器和仓库,广泛用于高效、一致的应用交付与部署。
6 0
|
1天前
证件工具
Hutool提供身份证工具类IdcardUtil,支持15/18位身份证校验、转换、获取年龄、生日、省份及脱敏处理,便捷高效。
3 0