【问题标题】:Do you need to close streams if you close socket in Java?如果在 Java 中关闭套接字,是否需要关闭流?
【发布时间】:2014-03-11 21:28:37
【问题描述】:

我听说调用 'socket.close()' 会自动关闭它的流。

会:

public void close() {
     try {
          socket.close();
     }catch(IOException e) { }
}

与以下效果相同:

public void close() {
     try {
          outputstream.close();
          inputstream.close();
          socket.close();
     }catch(IOException e) { }
}

如果您的目标是完全关闭套接字?

【问题讨论】:

    标签: java sockets networking stream


    【解决方案1】:

    关闭套接字也会关闭套接字的InputStreamOutputStream

    http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html#close()

    【讨论】:

      【解决方案2】:

      是的,关闭输入或输出流或套接字同时关闭流和套接字。

      但是你不应该关闭套接字,你应该关闭最外面的 OutputStreamWriter 你已经包裹了它的输出流,所以它会被刷新。只有你能做到。套接字只能关闭它的输出流,而不是你包裹它的东西。

      【讨论】:

      • 哦,好吧。所以你是说如果我使用ObjectOutputStream之类的东西,它不会受到socket.close()的影响,只有套接字中的流会被关闭,对吧?关闭最外层的流会关闭套接字的流吗?
      • 对于那种形式的问题(“所以你说”),我没有说任何类似的东西。 ObjectOutputStream 如果正在包装的流已关闭,则无法继续工作。关闭任何包装器流都会关闭它包装的流。见FilterInputStream.
      【解决方案3】:

      你应该这样做,因为你有一个缓冲的输出流。这将刷新所有尚未发送的数据。

      否则,关闭套接字将关闭流,因此是多余的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-26
        • 1970-01-01
        • 2013-07-17
        • 2014-02-26
        • 1970-01-01
        • 2013-03-04
        • 2014-07-16
        • 2012-06-18
        相关资源
        最近更新 更多