一、问题
为什么 String jsonStr=new String(intputArray,“utf-8”)中 intputArray过长会导致后面部分解析出的字符串为nullnull格式?
//获取request请求
HttpServletRequest request= ServletActionContext.getRequest();
//获取输入流
InputStream inputStream=request.getInputStream();
//转化为字节码
byte[] intputArray=new byte[request.getContentLength()];
//读取字节码
inputStream.read(intputArray);
//将字节码文件转化为string
String jsonStr=new String(intputArray,"utf-8");
先了解new String();
String jsonStr=new String(intputArray,“utf-8”);在创建时候创建了两个对象,
1、它会在类加载的时候在常量池中创建一个对象intputArray(内存中);
2、类加载完成后,执行 new 一个 类型为String的intputArray对象存储在堆中,然后虚拟机中栈将jsonStr 指向堆中new 出来的intputArray对象。
详细了解请参考: 深入了解new String()
众所周知:String其实是使用的一个char类型的数组来存储字符串中的字符的
那么问题来了,在步骤一中常量池中存在的String对象存储的数组长度会有限制吗?
答案是:有的,虽然存储的数组长度为2^31-1 = 2147483647 = 4GB,但是实际上知能存长度为65535个字节,此处和java虚拟机异常处理的有效范围解释有关
详细了解请参考 :java的String对象的大小有限制吗?
二、怎么解决
下面是本人思考的解决方案,有错误或者更好的建议希望大神指出;
/*
* 输入流接收存储字符串长度过长导致的读取问题,采用stringBuilder可以解决
* */
InputStream inputStream=request.getInputStream();
StringBuilder strResponse = new StringBuilder();
String strMessage = "";
BufferedReader reader;
reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
while (true) {
try {
if ((strMessage = reader.readLine()) == null) {
break;
}
} catch (IOException e) {
e.printStackTrace();
}
strResponse.append(strMessage);
}
reader.close();
inputStream.close();
//最后用toString方法来变成String变量就好了
String str = strResponse.toString()
//最后直接解析成对象就好了(fastjson 1.2.80版本)
Classz tclass = JSON.parseObject(str.toString(),classz.class);
至此完美解决上述问题