gpt4 book ai didi

java - 我应该在 ObjectOutputStream 的 closing() 之前调用 reset() 吗?

转载 作者:行者123 更新时间:2023-11-30 09:09:55 26 4
gpt4 key购买 nike

我正在接管一个包含以下代码的现有 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搞得我一头雾水……

感谢您的帮助!

最佳答案

没有。 reset() 通过网络发送一个标记,告诉对等方清除其句柄表。由于您无论如何都要关闭流,因此重置操作没有任何意义,而且这是一个额外的网络操作出错。只需关闭它即可。

至于其他问题:

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

  2. 在这里使用 try-with-resources 语法。会大大简化代码。

关于java - 我应该在 ObjectOutputStream 的 closing() 之前调用 reset() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22779514/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com