Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用流关闭套接字_Java_Sockets_Garbage Collection - Fatal编程技术网

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。谢谢你的解释。我不知道!