当前位置: 首页 > 知识库问答 >
问题:

HttpClient-如何在Java7自动释放资源[重复]

陶福
2023-03-14

我使用HttpClient,但遇到了一些问题。无论我是否想要获取实体,我都需要手动释放HttpGet和InputStream。是否有任何方法可以自动释放资源,例如Java7中的HttpClient的“尝试使用资源”。我希望不要使用httpget。中止()和流内。再次关闭()。

public class ClientConnectionRelease {
    public static void main(String[] args) throws Exception {
        HttpClient httpclient = new DefaultHttpClient();
        try {
            HttpGet httpget = new HttpGet("http://www.***.com");
            System.out.println("executing request " + httpget.getURI());
            HttpResponse response = httpclient.execute(httpget);
            System.out.println("----------------------------------------");
            System.out.println(response.getStatusLine());
            System.out.println("----------------------------------------");
            HttpEntity entity = response.getEntity();
            if (entity != null) {
                InputStream instream = entity.getContent();
                try {
                    instream.read();
                } catch (IOException ex) {
                    throw ex;
                } catch (RuntimeException ex) {
                    httpget.abort();
                    throw ex;
                } finally {
                    try {
                        instream.close();
                    } catch (Exception ignore) {
                        // do something
                    }
                }
            }
        } finally {
            httpclient.getConnectionManager().shutdown();
        }
    }
}

共有1个答案

袁元明
2023-03-14

HttpGet似乎还不支持AutoClosable接口(假设您使用的是Apache版本,但没有指定),但您可以用try with resources块替换第二个try块:

try (InputStream instream = entity.getContent()) {
... //your read/process code here
} catch(IOException|RuntimeException ex) {
    throw ex
}
 类似资料:
  • 问题内容: 我遍历了一堆URL,对于每个URL,我都在执行以下操作: 第一个查询很好,第二个查询抛出此异常: 线程“主”中的异常java.lang.IllegalStateException:无效使用SingleClientConnManager:仍然分配了连接。在分配另一个之前,请确保释放连接。在org.apache.http.impl.conn.SingleClientConnManager。

  • 我的问题类似于这个问题MySQL在连接丢失/断开的情况下回滚事务,但那是5年前的事了。 如果一个客户端(比如jdbc或其他什么)锁定了表中的一行,执行一些语句,那么网络就关闭了,所以mysql永远不会从客户端收到或命令,mysql是否支持自动回滚这个事务(解锁行)? 我引用它说,但是有多长时间以及在哪里设置它? 在类似的问题中,公认的答案是使用,如果设置为10秒这样的小数字,那么池中的空闲连接(如

  • 我在片段HomeFragment.java中声明了一个私有变量, 当我按下android导航栏上的back按钮时,应用程序被关闭,activity调用了onDestory()方法,但我发现变量mWeatherCards没有被回收,只有在我使用taskmanager关闭应用程序时才会被清理。taskmanager和back按钮关闭app和android资源释放时有什么区别?

  • 和和注释之间有什么区别? 我们应该在什么时候使用它们每一个?

  • > 指向自动分配实例的指针是否可以使该实例即使在实例化的作用域被保留后也不被解除分配? <罢工> 在 我读到的这篇文章说所有指向去分配内存的指针都是无效的。 但这家伙说的是手动解锁还是自动解锁后的行为? 这是一个示例:

  • 调用.unsubscribe()将取消一个成员的回调监听Observable流。 当创建Observable时,您还可以返回自定义回调onUnsubscribe,当收听流的成员取消订阅时将调用该回调。 这对于必须实现的任何类型的清理都很有用。 如果我们没有清除setTimeout,那么值仍然会发射,但是没有人听。 为了节省资源,我们应该停止发射值。 一个重要的事情要注意的是,当您调用.unsubs