100多M的json串处理
首先正常获取处理,通过http请求,这里是使用的AsyncHttpclient框架,
原代码:
类(例):
class TestHttp{
private Long id;
private String name;
}
http获取数据:
Future<Response> responseFuture = client.preparePost(url).execute();
Response response = responseFuture.get();
responseStr = response.getResponseBody();//获取到json串
TestHttp t = JSON.parseObject(responseStr,TestHttp.class);//解析到对象中
看着很正常,但是当responseStr是一个超大字符串(比如我的超过了100M),问题就出现了,程序肯定会报OOM(java.lang.OutOfMemoryError)。
解决方法:使用流来处理,先把获取到的数据分批次存下来,再通过JSONReader分批次读取。
JSONReader的用法可以参考:blog.csdn.net/drlyee/arti…
优化代码:
Future<Response> responseFuture = client.preparePost(url).execute();
Response response = responseFuture.get();
InputStream in = response.getResponseBodyAsStream();
byte[] bytes = new byte[1024];
FileOutputStream fos=new FileOutputStream(filePath);//filePath为需要存储的文件位置
int b;
while( (b =in.read(bytes)) != -1){
fos.write(bytes,0,b);
}
fos.close();
in.close();
读取数据:
JSONReader jsonReader = new JSONReader(new FileReader(filePath));//filePath为存储的文件位置
jsonReader.startObject();
while(jsonReader.hasNext()){
String key = jsonReader.readString();
if("id".equalsIgnoreCase(key)){
//处理数据
}else if("name".equalsIgnoreCase(key)){
//处理数据
}
}
jsonReader.endObject();
jsonReader.close();
结束,程序上线运行正常,不会再有OOM错误了