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