关注微信公众号: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.相关推荐

  1. java文件客户端下载_使用Java写一个minio的客户端上传下载文件

    标签:color   ati   tty   java   system   wired   format   media   param 前言: 确保已经安装了minio的服务端 代码: pom.x ...

  2. Java IOS客户端上传多张图片到服务端

    Java IOS客户端上传多张图片到服务端 业务场景:用户相册需要上传多张图片到服务器,上限为12张.本文主要介绍Java服务端的文件和流的处理. 下图为iOS端和服务端最终结果一览.  iOS端 : ...

  3. java rest客户端_Java中的简单REST客户端

    java rest客户端 如今,大多数用于与某些服务器通信的移动应用程序都使用REST服务. 这些服务也是JavaScript或jQuery的常用惯例. 现在,我知道在Java中为REST服务创建客户 ...

  4. java套接字客户端_使用Java从客户端套接字读取数据(Read data from a client socket in Java)...

    使用Java从客户端套接字读取数据(Read data from a client socket in Java) 我编写了从客户端套接字发送/接收数据的代码. 发送数据步骤已成功完成,但是当我想从套 ...

  5. java ssh客户端_简单的Java SSH客户端

    java ssh客户端 可以使用jcabi-ssh在Java中通过几行代码通过SSH执行shell命令: String hello = new Shell.Plain(new SSH("ss ...

  6. JAVA学习-JAVA实现客户端与服务器端的TCP通信

    JAVA实现客户端与服务器端的TCP通信 (JAVA 工程训练阶段一.训练任务三基本通信能力.基本任务3.2javaTCP 通信) 编写两个java application 应用程序,完成以下功能: ...

  7. Java Ftp客户端

    1.第三方库commons-net-*.jar 打开Download Apache Commons Net下载jar包 2.上传文件 private boolean upload(String abs ...

  8. java QQ客户端

    原文:java QQ客户端 源代码下载地址:http://www.zuidaima.com/share/1550463783668736.htm 运用了3gqq协议的swing小应用 官方验证 登录图 ...

  9. Java面试题之:Protoclol Buffer

    Java面试题之:Protoclol Buffer 一.简介 二.特点 一.简介   protocol buffer 是 google 的一个开源项目,它是用于结构化数据串行化的灵活.高效.自动的方法 ...

最新文章

  1. C++中的string::compare的使用
  2. 第十五届全国大学生智能车竞赛华南赛区成绩与奖项
  3. 3d饼图 vue_这是我见过最优雅的Vue图片轮播插件——Vue-Awesome-Swiper
  4. 什么样的女人才算是好老婆?
  5. 开源库OpenNMT-py使用记录
  6. 原型设计工具【收集转帖】
  7. php检测目录,php检测文件目录大小类
  8. 微服务开发框架 SpringCloud
  9. 硬件:断路器、接触器、继电器基础知识
  10. 用solidity语言开发代币智能合约
  11. Flink 1.12 资源管理新特性回顾
  12. 上机环境是什么意思_380元入手RX580满血显卡,跑分17万,还要什么自行车
  13. iOS开发进阶教程【第一季小试牛刀】
  14. 从 0.99999... = 1 到芝诺悖论
  15. 台式电脑计算机图标打不开怎么办,电脑计算机图标打不开怎么办
  16. 2022年全国大学生电子设计竞赛—TI杯模拟电子系统设计专题邀请赛X题
  17. 8uFTP连不上阿里云,4步解决8uFTP连不上阿里云问题
  18. 韩顺平python教程视频_尚硅谷_韩顺平_Linux_2018Linux基础入门教程全集
  19. [OHIF-Viewers]医疗数字阅片-医学影像-Module: Panel-自定义面板-中-es6-Object.defineProperty()定义属性...
  20. PS - 图层显示索引不能做修改(将索引图层改为正常图层)

热门文章

  1. linux 如何查看进程内用户虚拟空间分布
  2. Bootstrap-CSS-代码
  3. JWT token生成原理
  4. vue 监听渲染变化
  5. 关于vue.js 编程导航的使用:实现路由配置和跳转页面
  6. activexobject mysql_ActiveXObject函数详解(转)
  7. 自制hdmi线一头改vga图_东莞VGA数据线厂商价格
  8. mysql不能写重复键_mysql主键重复,不抱错,只更新的骚操作 (如果没有插入,如果有更新)...
  9. dz论坛发html乱码,发帖时出现乱码 - Discuz!-安装使用 - Discuz! 官方站 - Powered by Discuz!...
  10. B2C全开源无加密单商户商城源码可二开双端自适应