Java 用流关闭套接字
我下面的问题很简单 这是我的密码:Java 用流关闭套接字,java,sockets,garbage-collection,Java,Sockets,Garbage Collection,我下面的问题很简单 这是我的密码: public class Protocol implements Runnable { private SSLSocket socket = null; private InputStream is = null; private OutputStream os = null; ... public Protocol(Socket s) { socket = (SSLSocket)s;
public class Protocol implements Runnable {
private SSLSocket socket = null;
private InputStream is = null;
private OutputStream os = null;
...
public Protocol(Socket s) {
socket = (SSLSocket)s;
is = socket.getInputStream();
os = socket.getOutputStream();
}
@Override
public void run() {
...
ping();
socket.close();
...
}
public void ping() {
BufferedWriter writer;
try {
writer = new BufferedWriter(new OutputStreamWriter(os));
writer.write("OK");
}
catch (IOException e) { System.out.println("ERROR: " + e.getLocalizedMessage()); }
finally { writer = null; }
}
我知道我没有包含很多源代码,但这应该足以回答这个问题。如您所见,在“ping”方法中,我创建了一个BufferedWriter,用于向远程源写入“OK”字符串。稍后,我关闭插座
所以我的简单问题是——据我所知,由于我关闭了插座,链条应该是这样的:
关闭套接字---->关闭is和os---->关闭写入程序
因此,通过关闭套接字,我也关闭并允许GC释放BufferedWriter。我是理解正确还是做错了什么?对于我在其他方法(即BufferedInputStream)中初始化的所有写入程序和读取器,是否都是这样。通过在方法末尾将这些变量设置为null,我是否帮助GC区分应该释放哪些变量?或者我不应该这样做
谢谢
据我所知,由于我关闭了插座,链条应如下所示:
关闭套接字---->它关闭is和os---->关闭编写器
否。BufferedWriter
围绕套接字输出流,但套接字不知道这一点。它无法关闭它
因此,通过关闭套接字,我也关闭并允许GC释放BufferedWriter
否和否。BufferedWriter
在ping()
我理解对了吗
没有
还是做错了什么
对。您不应该为每条消息创建新的BufferedWriter
。您应该在插座的使用寿命内使用相同的插座,并关闭它而不是插座。同样,在套接字的生命周期中,您应该只使用一个输入流或读取器。否则,您可能会丢失其缓冲区中的数据
对于我在其他方法(即BufferedInputStream)中初始化的所有写入程序和读取器,是否都是这样
没有
通过在方法末尾将这些变量设置为null,我是否帮助GC区分应该释放哪些变量
不,你只是在浪费时间和空间。该方法即将退出,因此其所有局部变量都将消失
或者我不应该这样做
您不应该执行任何操作。使用。通过这种方式,资源会自动关闭,如果抛出异常,您不会泄漏它们。@MickMemonic虽然可以尝试使用资源,但在Android开发中不会这样做。所以,我想看看在不使用resource语句的情况下是如何做到的:)直截了当,切中要害。但是关闭套接字确实会关闭输入和输出流,如这里所述-。那么,为什么BufferedWriter不会产生相同的效果,因为它被包装在输出流中?或者说作者是“封闭的”和“不可用的”之间有什么区别。@Zack我没有说其他的。读我写的东西。它不会关闭BufferedWriter
。没有任何机制。我在上面说过。套接字无法知道甚至存在BufferedWriter
。它不可用,因为它环绕的内部流是关闭的,但它本身并没有关闭。你评论的最后一句话是天才。谢谢你。现在,如果我能弄明白为什么关闭writer而不是socket如此重要,我就会被设置好了!因为它包含一个可能需要刷新的缓冲区,就像在你的链接问题状态中一样。为此,你在链接的答案中得到一个+1,在这里得到一个+1。谢谢你的解释。我不知道!