当套接字关闭时,与套接字关联的流是否会自动关闭?

时间:2013-08-19 04:40:47

标签: java sockets stream

我使用Java套接字(TCP)与服务器通信。 我的问题是,当套接字关闭时,与套接字关联的输入和输出流是否会自动关闭?这样做是否安全?

2 个答案:

答案 0 :(得分:1)

根据oracle docs -

You should close any streams connected to a socket before you close the
socket itself.

根据this answer“你必须关闭输出流,因此它会被刷新。这会关闭套接字和输入流。关闭其中任何一个会关闭另外两个。您根本不需要关闭输入流。严格来说,为了安全起见,您可能还应该在finally块中关闭套接字本身。“

您可以显式停止来自inputStream的传入数据,如下所示

yourSocket.shutdownInput();

这将套接字的输入流放在“流结束”。发送到套接字输入流端的任何数据都会被确认,然后以静默方式丢弃。您仍然可以将数据发送到输出套接字。您必须再次关闭输出流和套接字。

同样请参阅shutdownOutput

答案 1 :(得分:1)

是。如果您关闭其输入流的Socket,或其输出流,则其他两个将自动关闭。

话虽如此,作为一个好的做法,你应该总是关闭你缠绕在套接字上的最外面的输出流或编写器,并且可能在finally块中关闭套接字本身。这样就可以确保最终输出被刷新。如果您使用的是缓冲输出流或编写器而您没有这样做,则会丢失缓冲区中的数据。