我应该在ObjectOutputStream上的close()之前调用reset()吗?

时间:2014-04-01 07:34:41

标签: java sockets objectoutputstream

我接管现有的JAVA项目,该项目包含以下代码:

class ConnectionHandler extends Thread {
    private Socket socket;

    public ConnectionHandler(Socket s) {
        this.socket = s;
    }

    private void doSthForRequest(ObjectInputStream in, ObjectOutputStream out) throws Exception {
        // Do something and write output to out:
        // out.writeObject(someOutput);
    }

    public void run() {

        ObjectOutputStream out = null;
        ObjectInputStream in = null;

        try {
            in = new ObjectInputStream(socket.getInputStream());
            out = new ObjectOutputStream(socket.getOutputStream());
            while (true) {
                out.reset();
                doSthForRequest(in, out);
            }
        } catch (Exception ex) {
            if (out != null && !socket.isOutputShutdown()) {
                try {
                    out.writeObject(ex);
                    out.flush();
                } catch (Exception ex2) {}
            }
        } finally {
            if (out != null) {
                try {
                    out.reset(); // any reason for this?
                } catch (Exception ee) {}
            }
            if (out != null) {
                try {
                    out.close();
                } catch (Exception ee) {}
            }
            try {
                socket.close();
            } catch (Exception e) {}
        }

        socket = null;
    }
}

有一些ConnectionHandler线程在套接字上提供请求并产生输出。我的问题是:

如果在紧随其后的close()调用中,reset()调用仍然有意义吗?

原作者只留下一行评论// clear outputstream cache让我感到困惑......

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

没有。 reset()通过线路发送一个标签,告诉对等方清除其句柄表。无论如何,当您即将关闭流时,重置操作没有任何意义,并且它是一个出错的额外网络操作。关闭它。

至于其他问题:

  1. ObjectOutputStream之前构造ObjectInputStream.否则可能发生死锁。

  2. 在此处使用try-with-resources语法。它会简化代码。