Java 是否需要关闭从套接字创建的输入/输出流';套接字关闭时s IO流?

Java 是否需要关闭从套接字创建的输入/输出流';套接字关闭时s IO流?,java,sockets,Java,Sockets,如果任何IO流或读写器是从套接字的输入或输出流创建的,是否需要在套接字关闭之前或之后关闭它们?来自: 关闭此套接字还将关闭套接字的InputStream和OutputStream 当然,代码显式打开的任何读写器也应该显式关闭,但就网络资源而言,它们将被释放 就操作顺序而言,标准规则适用:last to open->first to close。因此,在关闭底层套接字连接之前,请务必关闭所有读/写器。在这种情况下,这是不必要的,但不会造成任何伤害 但是,如果尚未在PrintWriter构造函数中设

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

来自:

关闭此套接字还将关闭套接字的InputStream和OutputStream

当然,代码显式打开的任何读写器也应该显式关闭,但就网络资源而言,它们将被释放


就操作顺序而言,标准规则适用:last to open->first to close。因此,在关闭底层套接字连接之前,请务必关闭所有读/写器。

在这种情况下,这是不必要的,但不会造成任何伤害

但是,如果尚未在
PrintWriter
构造函数中设置“autoFlush”标志,则如果在关闭
套接字之前未关闭或刷新
Writer
,则可能无法发送某些数据。(如果您以错误的顺序关闭,可能会出现异常!)

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


与泄漏资源(文件描述符)无关。如果套接字关闭,则释放所有I/O资源。您也不需要调用
shutdownInput
shutdownOutput
。关闭
插座
即可完成此操作

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

您应该关闭从套接字输出流创建的最外层的
OutputStream
Writer
。这将刷新流并关闭套接字及其输入流。关闭套接字的任何其他方面,例如它的直接输出流、输入流或围绕它的任何东西,或者套接字本身,可以完成大部分但不是全部:具体地说,在输出流之前关闭输入流,就像您在示例中所做的那样,可以防止输出流被刷新,因此可能会丢失数据


在关闭前立即调用
shutdownInput()
shutdownOutput()
总是多余的。

关闭它们是一种很好的做法。我同意苏丹舒的观点:这是一个很好的做法。此外,您还应该在此处使用try/catch:想象
in.close()
失败:
out
con
保持打开状态。嗯。。。。这不是Java代码…但它使用Java套接字和IO类;)我看不到readLine()循环的意义。如果它传递数据,您就将其丢弃;如果它传递null,则表示对等方优雅地关闭了连接,而不是连接被重置。这个密码是自欺欺人的。谢谢。考虑到它们是自动关闭的,我认为已经过时了。这并没有回答OPs的全部问题——他还问应该如何处理从这些流创建的读卡器和写卡器。我刚刚研究了
InputStreamReader
BufferedReader
PrintWriter
的源代码。它们都
确保在执行任何实际IO之前重新打开底层流。在底层流关闭的情况下,(根据我的理解),它们将成为垃圾对象,并将被GCed。@HowardGuo该链接中的代码不是“过时的”,而是高度冗余的。例如,从良好实践的角度来看,您是否建议明确关闭读写器?嗯。。。我不建议这样做。我认为做(对我来说)明显多余的事情没有任何意义。然而,正如我所说,这样做没有什么害处。因此,如果“最佳实践”监视器说“就这么做”。。。不要争辩。:-)或者换一种说法,如果你不知道是否有必要,那么按与打开相反的顺序关闭所有流是。。。安全的。
  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()
  }