1

我有以下代码:

public void disconnect()
{
    running = false;
    if(thread != null)
        thread.interrupt();
    thread = null;

    try
    {
        socket.close();
    }catch(Exception e){e.printStackTrace();}
}

我有一个从流中收集输入的 BufferedReader 和一个通过输出流发送消息的 PrintWriter。在我关闭套接字之前是否应该关闭 BufferedReader 和 PrintWriter?让 i/o 流保持打开状态是不是很糟糕?

4

4 回答 4

4

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

于 2012-06-15T01:23:25.223 回答
4

根据Java网络教程

“在关闭套接字本身之前,您应该关闭任何连接到套接字的流。”

于 2012-06-15T00:32:46.007 回答
1

如果您不关闭BufferedWriter,您可能会丢失一些缓冲但未刷新的数据。

还有一种观点认为你不应该使用PrintWriter,或者如果你这样做要小心,因为它会吞下IOExceptions。

于 2012-06-15T00:29:50.583 回答
0

您打开的每个流都使用操作系统资源。当您在流上调用 close 时,它​​被标记为垃圾收集,并且内存在 GC 后被释放。如果您不关闭流,它将被 GC 关闭(http://docs.oracle.com/javase/7/docs/api/java/io/FileInputStream.html#close%28%29)但它是完全不清楚,GC什么时候会命中那个对象。

因此,最好关闭流以立即释放内存。

于 2012-06-15T00:30:37.507 回答