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



我正在接管一个包含以下代码的现有 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;
    }
}

有一些连接处理程序线程在套接字上处理请求并生成输出。我的问题是:

如果 reset() 调用之后立即有一个 close() 调用,它是否仍然有意义?

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

感谢您的帮助!

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

至于其他问题:

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

  2. 在此处使用试用资源语法。它将大大简化代码。

最新更新