关闭Input / OutputStream和直接关闭Socket有什么区别?

我只是想知道当我们在inputStream上调用close并使用与套接字关联的outStream时java会做什么。 与套接字上的close调用有什么区别,即Socket.close()。

如果我们只关闭套接字上的io流,但不关闭套接字,我们可以再次重新打开套接字上的io流吗?

提前致谢!

您应该关闭从套接字创建的最外面的输出流。 这将冲洗它。 关闭套接字或输入流不会这样做,所以它是不够的。 关闭该输出流后,您无需执行任何其他操作。

从Socket的java api文档:

public void close()throws IOException关闭此套接字。 当前在此套接字上的I / O操作中阻塞的任何线程都将抛出SocketException。

一旦套接字关闭,它就无法用于进一步的网络连接(即无法重新连接或反弹)。 需要创建一个新的套接字。

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

如果此套接字具有关联的通道,则通道也将关闭。

关闭Socket的InputStream将导致Socket关闭。 关闭Socket的OutputStream也是如此。

来自Socket#getInputStream()的java api文档

关闭返回的InputStream将关闭关联的套接字。

检查API文档,这是有原因的。

这更像是一个评论,而不是一个好的答案:(我宁愿在上面的答案中添加评论,但我没有代表)

正如我所读到的那样,问题是“我可以关闭套接字上的流然后在同一个套接字上打开一个流吗?”……但是人们似乎在回答这个问题:“我应该如何干净地关闭我的套接字?” ……这不是被问到的问题。

被问到的问题的答案是“不”。 关闭流时,关闭套接字。

(我确实理解为什么,至少在一种情况下,有人可能会问这个问题。当你通过套接字传输Java属性时,接收端必须看到EOF才能识别属性的结束 – 接收者看到EOF的发送者必须关闭流/套接字。但是,如果您有一个命令/响应协议在该套接字上运行,您不想关闭它,否则您将丢失要发送响应的通道。请参阅Java流Socket上的属性,用于处理此问题的一种方法)