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

 

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

油炸小波

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值