我有以下代码:
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流保持打开是不是很糟糕?
答案 0 :(得分:4)
“在关闭套接字本身之前,应关闭连接到套接字的所有流。”
答案 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点击该对象时它根本不清楚。
因此,关闭流以立即释放内存总是更好。