在Java中,URL连接何时关闭?

88

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?
}

10
不要使用 catch(Exception),如果有特定的异常被抛出,应该在独立的子句中分别捕获每一个异常。 - OscarRyz
4
或者至少最后捕获异常(在其他的异常都没有被捕获的情况下)。 - jeremy
3个回答

56

如果将对象转换为HttpURLConnection,那么它会有一个disconnect()方法。如果连接处于空闲状态,它可能会立即断开连接。但不能保证一定能够立即断开。


54

这取决于协议中指定的具体协议。有些保持持久连接,而其他则在连接所提供的输入或输出流关闭时关闭它们的连接。但是除了记得关闭从URLConnection打开的流之外,您无法做其他任何事情。

来自java.net.URLConnection的javadoc

在请求完成后调用URLConnection的InputStream或OutputStream上的close()方法可能会释放与此实例相关联的网络资源,除非特定的协议规范指定不同的行为。


2
这个回答很好,但没有涵盖HttpUrlConnection的名义情况。 - Snicolas

0

我必须一次下载数百个文件,遇到了问题。

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

adb shell ps

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

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

通常启动时,我看到约150个打开的描述符。而在下载文件时,则达到了700多个。它们的数量只有在几分钟后才会减少,看起来Android会在后台释放它们,而不是当您在流上执行关闭(close)) 操作时。

因此,我们无法确定连接实际关闭的时间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接