HttpClient 需要关闭的资源
使用HttpClient 访问会涉及到三个层次的资源, 从上往下依次是:
- HttpClient 类型的对象。这是Http 呼叫的客户端。
- Http的请求的对象,一般是HttpGet 或者HttpPost, 这个代码了一个Http的链接请求。
- 从目标地址获取的响应流 HttpResponse,某些状况下响应的结果是以流的形式返回,使用完成最好是关闭流。
HttpClient 资源关闭的方式
资源的初始化的顺序是 HttpClient > Http请求 > 响应流, 在释放时以从下往上的顺序释放, 依次是: 关闭响应流 > 关闭Http请求 > 关闭HttpClient 。
这三种类型的资源释放的方式分别是:
- HttpClient 使用 close() 方法
- Http请求 使用 close() 方法
- 响应流可以使用Stream 的close() 方法关闭, HttpClient 也提供了EntityUtils.consume()方法用来关闭响应流。
Java 处理资源释放的语法
- 在早期的Java 语法中, 主要在 try finally 语法中释放资源
- 在Java 8 之后, 使用 try 资源之后就可以直接释放资源。
HttpClient 资源释放示例代码
综合以上, 在 HttpClient 中释放资源就可以多种方式。
1. [推荐] 使用 try 资源 + EntityUtils.consume()
在Java 8 及以上的版本, 推荐使用try 资源 释放资源, 理由是简洁。
对响应流的释放使用EntityUtils.consume(entity);
。
完整的示例代码如下:
@Test
public void byTryRelease() throws Exception {
try (CloseableHttpClient httpclient = HttpClients.createDefault()) { //3. 关闭客户端资源
HttpGet httpGet = new HttpGet("http://www.baidu.com");
try (CloseableHttpResponse response = httpclient.execute(httpGet)) { //2. 关闭响应资源
HttpEntity entity = response.getEntity();
EntityUtils.consume(entity); //1. 关闭响应流
}
}
}
2. 使用 try finally + EntityUtils.consume()
- 使用try finally 释放资源
- 使用 EntityUtils.consume() 释放资源
@Test
public void byManualRelease() throws Exception{
CloseableHttpClient httpclient = HttpClients.createDefault();
try {
HttpGet httpGet = new HttpGet("http://www.baidu.com");
CloseableHttpResponse response = httpclient.execute(httpGet);
try {
HttpEntity entity = response.getEntity();
EntityUtils.consume(entity); //1. 关闭响应流
}finally {
response.close(); //2. 关闭响应资源
}
}finally {
httpclient.close();//3. 关闭客户端资源
}
}
3. 使用 try finally + 手动关闭输入流
- 使用try finally 释放资源
- 通过Stream 的close() 关闭输入流
@Test
public void byManualRelease2() throws Exception{
CloseableHttpClient httpclient = HttpClients.createDefault();
try {
HttpGet httpGet = new HttpGet("http://www.baidu.com");
CloseableHttpResponse response = httpclient.execute(httpGet);
try {
HttpEntity entity = response.getEntity();
//EntityUtils.consume(entity); //1. 关闭响应流
if (entity != null) {
InputStream inStream = entity.getContent();
try {
inStream.read();
} finally {
inStream.close(); //1. 关闭响应流
}
}
}finally {
response.close(); //2. 关闭响应资源
}
}finally {
httpclient.close();//3. 关闭客户端资源
}
}
总结
- 以上三种方式的实现的效果是一样的, 差别是代码的简洁性和美观性
- Java 8 推荐使用 try 资源的方式使用和释放资源。