我正在接管一个包含以下代码的现有 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()
通过线路发送一个标记,告诉对等方清除其句柄表。无论如何,当您要关闭流时,重置操作没有任何意义,并且出错是一个额外的网络操作。只需关闭它。
至于其他问题:
-
在
ObjectInputStream.
之前构造ObjectOutputStream
否则可能会发生死锁。 -
在此处使用试用资源语法。它将大大简化代码。