如何正确关闭套接字及其 InputStream?

How to properly close a socket and its InputStream?

假设我有一个连接的套接字和关联的 InputStream。完成此连接后,如何正确关闭它们(无泄漏)?

我已经在 SO 和其他地方搜索过这个问题,但我得到的答案要么模棱两可,要么相互矛盾。我应该

要在不泄漏任何资源的情况下清理 Socket,请调用 close(),然后丢弃对 Socket 的所有引用。通常,此建议对所有 Java Socket subclass 都是有效的,包括 ServerSocketSSLSocket.

正如 documentation 所解释的那样,close() 关闭套接字的 InputStreamOutputStream,因此无需对这些流执行单独的 close() 调用.

而且,仅关闭 InputStreamOutputStream 是不够的。 对 Socket 基础 class (old example) 的源代码的检查证明了为什么这是真的,至少对于 Android.