JAVA—HTTP客户端警告:Going to buffer response body of large or unknown size.
关注微信公众号:CodingTechWork,一起学习进步。
原编码问题
在修复原有代码bug时,发现日志里经常抛出Going to buffer response body of large or unknown size. Using getResponseBodyAsStream instead is recommended
,这种提示。查看了原有代码中的逻辑如下:
... ...
HttpClient httpclient = new HttpClient();
GetMethod getMethod = new GetMethod(url);
int statusCode = httpclient.executeMethod(getMethod);
String respContent = getMethod.getResponseBodyAsString();
... ...
原因就在于使用了getResponseBodyAsString()
方法
源码分析
getResponseBodyAsString()源码
//getResponseBodyAsString()方法源码public String getResponseBodyAsString() throws IOException {byte[] rawdata = null;if (this.responseAvailable()) {//调用了getResponseBody(),容易消耗内存rawdata = this.getResponseBody();}return rawdata != null ? EncodingUtil.getString(rawdata, this.getResponseCharSet()) : null;}//responseAvailable()方法源码private boolean responseAvailable() {return this.responseBody != null || this.responseStream != null;}//getResponseBody()方法源码public byte[] getResponseBody() throws IOException {if (this.responseBody == null) {InputStream instream = this.getResponseBodyAsStream();if (instream != null) {long contentLength = this.getResponseContentLength();if (contentLength > 2147483647L) {throw new IOException("Content too large to be buffered: " + contentLength + " bytes");}int limit = this.getParams().getIntParameter("http.method.response.buffer.warnlimit", 1048576);if (contentLength == -1L || contentLength > (long)limit) {//这里是warn的原文LOG.warn("Going to buffer response body of large or unknown size. Using getResponseBodyAsStream instead is recommended.");}LOG.debug("Buffering response body");ByteArrayOutputStream outstream = new ByteArrayOutputStream(contentLength > 0L ? (int)contentLength : 4096);byte[] buffer = new byte[4096];int len;while((len = instream.read(buffer)) > 0) {outstream.write(buffer, 0, len);}outstream.close();this.setResponseStream((InputStream)null);this.responseBody = outstream.toByteArray();}}return this.responseBody;}
从源码中可以看出,warn的条件是(contentLength == -1L || contentLength > (long)limit)
,如果http头没有指定contentLength
或大于上限值(默认1M),就会抛异常。其实,如果返回的结果比较确定,对程序没有太大影响。而对于返回结果不确定时,源码也建议我们使用下面的getResponseBodyAsStream()
方法。
getResponseBodyAsStream()源码
public InputStream getResponseBodyAsStream() throws IOException {if (this.responseStream != null) {return this.responseStream;} else if (this.responseBody != null) {InputStream byteResponseStream = new ByteArrayInputStream(this.responseBody);LOG.debug("re-creating response stream from byte array");return byteResponseStream;} else {return null;}}
从源码中可以看出,getResponseBodyAsStream()
内部没有使用getResponseBody()
方法,避免了内存耗尽问题,而是使用了InputStream
流方式处理。
优化原编码
... ...
HttpClient httpclient = new HttpClient();
GetMethod getMethod = new GetMethod(url);
int statusCode = httpclient.executeMethod(getMethod);
//String respContent = getMethod.getResponseBodyAsString();
//使用getResponseBodyAsStream()
InputStream inputStream = getMethod.getResponseBodyAsStream();
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
StringBuffer stringBuffer = new StringBuffer();
String str = "";
while ((str = br.readLine()) != null) {stringBuffer.append(str);
}
LOGGER.info("respContent: {}", stringBuffer.toString());
... ...
测了一把,哦豁,不再报这个异常了。完美。
JAVA—HTTP客户端警告:Going to buffer response body of large or unknown size.相关推荐
- java文件客户端下载_使用Java写一个minio的客户端上传下载文件
标签:color ati tty java system wired format media param 前言: 确保已经安装了minio的服务端 代码: pom.x ...
- Java IOS客户端上传多张图片到服务端
Java IOS客户端上传多张图片到服务端 业务场景:用户相册需要上传多张图片到服务器,上限为12张.本文主要介绍Java服务端的文件和流的处理. 下图为iOS端和服务端最终结果一览. iOS端 : ...
- java rest客户端_Java中的简单REST客户端
java rest客户端 如今,大多数用于与某些服务器通信的移动应用程序都使用REST服务. 这些服务也是JavaScript或jQuery的常用惯例. 现在,我知道在Java中为REST服务创建客户 ...
- java套接字客户端_使用Java从客户端套接字读取数据(Read data from a client socket in Java)...
使用Java从客户端套接字读取数据(Read data from a client socket in Java) 我编写了从客户端套接字发送/接收数据的代码. 发送数据步骤已成功完成,但是当我想从套 ...
- java ssh客户端_简单的Java SSH客户端
java ssh客户端 可以使用jcabi-ssh在Java中通过几行代码通过SSH执行shell命令: String hello = new Shell.Plain(new SSH("ss ...
- JAVA学习-JAVA实现客户端与服务器端的TCP通信
JAVA实现客户端与服务器端的TCP通信 (JAVA 工程训练阶段一.训练任务三基本通信能力.基本任务3.2javaTCP 通信) 编写两个java application 应用程序,完成以下功能: ...
- Java Ftp客户端
1.第三方库commons-net-*.jar 打开Download Apache Commons Net下载jar包 2.上传文件 private boolean upload(String abs ...
- java QQ客户端
原文:java QQ客户端 源代码下载地址:http://www.zuidaima.com/share/1550463783668736.htm 运用了3gqq协议的swing小应用 官方验证 登录图 ...
- Java面试题之:Protoclol Buffer
Java面试题之:Protoclol Buffer 一.简介 二.特点 一.简介 protocol buffer 是 google 的一个开源项目,它是用于结构化数据串行化的灵活.高效.自动的方法 ...
最新文章
- C++中的string::compare的使用
- 第十五届全国大学生智能车竞赛华南赛区成绩与奖项
- 3d饼图 vue_这是我见过最优雅的Vue图片轮播插件——Vue-Awesome-Swiper
- 什么样的女人才算是好老婆?
- 开源库OpenNMT-py使用记录
- 原型设计工具【收集转帖】
- php检测目录,php检测文件目录大小类
- 微服务开发框架 SpringCloud
- 硬件:断路器、接触器、继电器基础知识
- 用solidity语言开发代币智能合约
- Flink 1.12 资源管理新特性回顾
- 上机环境是什么意思_380元入手RX580满血显卡,跑分17万,还要什么自行车
- iOS开发进阶教程【第一季小试牛刀】
- 从 0.99999... = 1 到芝诺悖论
- 台式电脑计算机图标打不开怎么办,电脑计算机图标打不开怎么办
- 2022年全国大学生电子设计竞赛—TI杯模拟电子系统设计专题邀请赛X题
- 8uFTP连不上阿里云,4步解决8uFTP连不上阿里云问题
- 韩顺平python教程视频_尚硅谷_韩顺平_Linux_2018Linux基础入门教程全集
- [OHIF-Viewers]医疗数字阅片-医学影像-Module: Panel-自定义面板-中-es6-Object.defineProperty()定义属性...
- PS - 图层显示索引不能做修改(将索引图层改为正常图层)
热门文章
- linux 如何查看进程内用户虚拟空间分布
- Bootstrap-CSS-代码
- JWT token生成原理
- vue 监听渲染变化
- 关于vue.js 编程导航的使用:实现路由配置和跳转页面
- activexobject mysql_ActiveXObject函数详解(转)
- 自制hdmi线一头改vga图_东莞VGA数据线厂商价格
- mysql不能写重复键_mysql主键重复,不抱错,只更新的骚操作 (如果没有插入,如果有更新)...
- dz论坛发html乱码,发帖时出现乱码 - Discuz!-安装使用 - Discuz! 官方站 - Powered by Discuz!...
- B2C全开源无加密单商户商城源码可二开双端自适应