Java流是否应关闭在支持套接字关闭之前?

时间:2012-06-15 00:21:49

标签: java sockets networking optimization io

我有以下代码:

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 个答案:

答案 0 :(得分:4)

根据Java Networking Tutorial

  

“在关闭套接字本身之前,应关闭连接到套接字的所有流。”

答案 1 :(得分:4)

必须关闭输出流,以便刷新它。这将关闭套接字和输入流。关闭其中任何一个将结束另外两个。您根本不需要关闭输入流。严格来说,出于安全考虑,您可能还应该在最后一个块中关闭套接字。

答案 2 :(得分:1)

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

还有一种思想流派认为你不应该使用PrintWriter,或者要小心,因为它吞下了IOException

答案 3 :(得分:0)

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

因此,关闭流以立即释放内存总是更好。