当套接字关闭时,是否有必要关闭从套接字IO流创建的输入/输出流?

时间:2013-03-14 09:24:28

标签: java sockets

  private val in = new BufferedReader(new InputStreamReader(con.getInputStream()))
  private val out = new PrintWriter(con.getOutputStream(), true)
  try {
    while (true) {
      if (in.readLine() == null)
        throw new IOException("connection reset by peer")
    }
  } catch {
    case e: Exception =>
  } finally {

    // Is this necessary?
    in.close()
    out.close()

    // Close socket
    con.shutdownInput()
    con.shutdownOutput()
    con.close()
  }

如果从套接字的输入或输出流创建了任何IO流或读/写器,是否需要在套接字关闭之前或之后关闭它们?

3 个答案:

答案 0 :(得分:6)

  

如果从套接字的输入或输出流创建了任何IO流或读/写器,是否需要在套接字关闭之前或之后关闭它们?

您应该从套接字输出流中关闭已创建的最外层OutputStreamWriter。这将刷新流并关闭套接字及其输入流。关闭套接字的任何其他方面,例如它的直接输出流,它的输入流或其周围的任何东西,或者套接字本身,完成了大部分但不是全部:特别是,在输出流之前关闭输入流在您的示例中阻止输出流被刷新,因此可能会丢失数据。

在结束前立即致电shutdownInput()shutdownOutput(),这总是多余的。

答案 1 :(得分:5)

来自Socket Javadoc

  

关闭此套接字也将关闭套接字的InputStream和OutputStream。

当然,您的代码明确打开的任何读者/编写者也应该被明确关闭,但就网络资源而言,它们将被释放,无论如何。

就行动的顺序而言,标准规则适用:最后打开 - >先关闭因此,在关闭底层套接字连接之前,请务必关闭所有读者/编写者

答案 2 :(得分:0)

在这种情况下没有必要,但没有任何伤害。

但是,如果你没有在PrintWriter构造函数中设置“autoFlush”标志,那么如果在关闭Writer之前没有关闭或刷新Socket,可能无法发送数据。 (如果你以错误的顺序关闭,你可以得到例外!)

对于读者/输入流,这不是一个问题。您已经决定忽略任何缓冲输入。


不关心泄漏资源(文件描述符)。如果Socket关闭,则释放所有I / O资源。您也无需致电shutdownInputshutdownOutput。关闭Socket即可。