常用工具类---StringUtil

本文涉及的产品
可观测监控 Prometheus 版,每月50GB免费额度
应用实时监控服务-用户体验监控,每月100OCU免费额度
性能测试 PTS,5000VUM额度
简介: 这篇文档讨论了Java中处理超长字符串的问题。由于字符串字面量限制为65534个字符,超过此长度会导致编译错误。当从HTTP或RPC接收长字符串时,不能直接用字符串字面量接收。解决方案是使用StringBuilder动态构建字符串,通过分组处理超过限制的字符序列。示例代码展示了如何分割并重新组合超过长度限制的字符串。

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


相关文章
|
4月前
|
Java
常用工具类-Objects
本文介绍了Java标准库中的Objects工具类,它提供了一系列用于操作对象的实用方法,包括判断对象是否为空、比较两个对象是否相等、比较两个对象以及判断两个数组是否深度相等。文章通过示例代码展示了Objects类中isNull、nonNull、requireNull、equals、compare和deepEquals等方法的使用,突出了Objects类在处理对象时的便利性和实用性。
常用工具类-Objects
|
4月前
|
Java
常用工具类-Collections
本文介绍了Java中Collections工具类的功能和用法,包括对集合进行排序、查找、填充操作,判断集合是否有交集,以及创建不可变集合的方法。通过示例代码展示了如何使用Collections类提供的静态方法,如reverse、shuffle、sort、swap、binarySearch、max、min、fill、frequency、disjoint、emptyList等,突出了Collections类在操作集合时的便利性和实用性。
常用工具类-Collections
|
6月前
|
XML JSON Java
常用工具类---JSONUtil
这段内容提供了Java中将不同数据结构转换为JSON的代码示例。包括使用`JSONArray`将一维和二维数组、对象、Map及List转换为JSON字符串,并展示了如何从JSON字符串转换回Object、List以及XML到JSON的转换。
常用工具类---日期时间工具
诸多时间的获取及计算,以及一些时间类型的转换!!!都是非常实用的哦~~~
|
6月前
|
Java
常用工具类---IOUtils
该文档是关于Java中文件操作的说明,强调所有IO操作必须在`finally`块中关闭。提供了三个示例:1) 读取指定文件`test.txt`的全部内容,使用`FileReader`和`StringBuffer`;2) 追加内容到`test.txt`文件,通过`FileOutputStream`, `OutputStreamWriter`和`BufferedWriter`实现;3) 递归遍历目录下的所有文件,使用`File`类和递归函数获取每个文件的绝对路径。
|
8月前
|
SQL JSON Java
Java【问题记录 02】对象封装+固定排序+list All elements are null引起的异常处理+Missing artifact com.sun:tools:jar:1.8.0
Java【问题记录 02】对象封装+固定排序+list All elements are null引起的异常处理+Missing artifact com.sun:tools:jar:1.8.0
90 0
Exception in thread “main“ java.io.IOException: Could not find resource mybatis-config.xml
Exception in thread “main“ java.io.IOException: Could not find resource mybatis-config.xml
Exception in thread “main“ java.io.IOException: Could not find resource mybatis-config.xml
|
JSON 缓存 Dubbo
巨坑系列:Java Bean 转 Map 的那些坑
有些业务场景下需要将 Java Bean 转成 Map 再使用。本以为很简单场景,但是坑很多。
1202 0
巨坑系列:Java Bean 转 Map 的那些坑
|
JSON 缓存 Dubbo
Java Bean 转 Map 的巨坑,注意了!!!(2)
Java Bean 转 Map 的巨坑,注意了!!!(2)
203 0
Java Bean 转 Map 的巨坑,注意了!!!(2)
|
JSON 数据可视化 Java
Java Bean 转 Map 的巨坑,注意了!!!(1)
Java Bean 转 Map 的巨坑,注意了!!!(1)
365 0
Java Bean 转 Map 的巨坑,注意了!!!(1)