zoukankan      html  css  js  c++  java
  • 多次读取HttpEntity内容

    有时,需要重复读取HttpEntity,直接使用是行不通的,这时需要使用BufferedHttpEntity类将其进行包装一下。

    public static void main(String[] args) throws IOException {
            CloseableHttpClient httpclient = HttpClients.createDefault();
            HttpGet httpget = new HttpGet("http://localhost:9999/index");
            CloseableHttpResponse response = httpclient.execute(httpget);
            try {
                HttpEntity entity = response.getEntity();
                if (entity != null) {
                    System.out.println("==============重复使用response entity================================");
                    entity = new BufferedHttpEntity(entity);
                    System.out.println(EntityUtils.toString(entity));
                    System.out.println(EntityUtils.toString(entity));
    
                }
            } finally {
                response.close();
            }
        }

    其原理也很简单,直接看下源码

    (1) 使用了一个byte[] 将entity的内容缓存起来

      public BufferedHttpEntity(final HttpEntity entity) throws IOException {
            super(entity);
            if (!entity.isRepeatable() || entity.getContentLength() < 0) {
                final ByteArrayOutputStream out = new ByteArrayOutputStream();
                entity.writeTo(out);
                out.flush();
                this.buffer = out.toByteArray();
            } else {
                this.buffer = null;
            }
        }

    将entity 写到 ByteArrayOutputStream 对象,然后转成byteArray存起来, this.buffer 就是一个byte[]。

    (2)读取内容时直接读取缓存byte[]中的内容 

    而getContent()源码如下:

      public InputStream getContent() throws IOException {
            return this.buffer != null ? new ByteArrayInputStream(this.buffer) : super.getContent();
        }

    由第一步知,buffer不为null,  所以每次读取内容时,都会创建一个ByteArrayInputStream对象!从而间接的实现了重复使用enity的目的。

  • 相关阅读:
    Mysql Explain 详解
    TP5和TP3.2的区别
    Http协议详解
    TCP协议三次握手与四次挥手详解
    一些常规面试问题
    计算机网络常识
    队列与栈的区别
    面向对象
    在浏览器中输入 www.baidu.com 后执行的全部过程
    SVN在ubuntu的安装和使用
  • 原文地址:https://www.cnblogs.com/z-qinfeng/p/11706291.html
Copyright © 2011-2022 走看看