【问题标题】:In Java when does a URL connection close?在 Java 中,URL 连接何时关闭?
【发布时间】:2010-09-21 08:04:09
【问题描述】:

java 什么时候放弃与 URL 的连接?我在 URL 或 URLConnection 上都没有看到 close() 方法,所以它会在请求完成后立即释放连接吗?我主要是想看看我是否需要在异常处理程序中进行任何清理。

try {
  URL url = new URL("http://foo.bar");
  URLConnection conn = url.openConnection();
  // use the connection
}
catch (Exception e) {
  // any clean up here?
}

【问题讨论】:

  • 永远不要使用catch(Exception),如果抛出一个特定的异常,在它自己的子句中捕获每一个
  • 或者至少最后捕获异常(以防其他人都没有捕获异常)。

标签: java exception url connection


【解决方案1】:

如果您强制转换为 HttpURLConnection,则有一个 disconnect() 方法。如果连接空闲,它可能会立即断开连接。没有保证。

【讨论】:

    【解决方案2】:

    这取决于协议中指定的具体协议。一些保持持久连接,另一些在连接给定的输入或输出流中关闭呼叫时关闭它们的连接。但除了记住关闭从 URLConnection 打开的流之外,您无能为力。

    来自 java.net.URLConnection 的 javadoc

    调用 close() 方法 输入流或输出流 请求后的 URLConnection 可能会释放 与此相关的网络资源 实例,除非特定协议 规格指定不同 行为。

    【讨论】:

    • 这个答案很好,但不包括 HttpUrlConnection 的名义情况。
    【解决方案3】:

    我不得不一次下载数百个文件并遇到问题。

    您可以使用以下命令检查应用的打开描述符:

    adb shell ps
    

    在列表中找到您的应用程序 PID 并使用另一个命令:

    adb shell run-as YOUR_PACKAGE_NAME ls -l  /proc/YOUR_PID/fd
    

    我在通常的启动中看到大约 150 个打开的描述符。下载文件时有 700 多个。他们的数量只会在几分钟后减少,看起来 Android 在后台释放了他们,而不是当你可以在流中 close 时。

    【讨论】:

      猜你喜欢
      • 2020-02-02
      • 1970-01-01
      • 1970-01-01
      • 2017-04-13
      • 2013-02-20
      • 2015-01-10
      • 1970-01-01
      • 1970-01-01
      • 2018-06-10
      相关资源
      最近更新 更多