Java输入流缓冲对象?

4
我有一个客户端-服务器应用程序,当新的客户端套接字加入时,服务器会向所有客户端发送所有客户端列表。问题在于,当新客户端加入时,它会得到正确的列表,但旧客户端得到的是他们自己加入时得到的旧列表。就好像他们每次都从输入流中获取相同的对象。
我能否以某种方式清除输入流?
读取对象:
while((inObject = in.readObject()) != null) {
   ...
}

发送对象:
out.writeObject(object);

客户端正在收到您发送的内容。他们并不是“从输入流中取相同的对象”。您需要修复发送列表的方式,因为您没有发送正确的数据。 - Brian Roach
1
ObjectOutputStream.reset()是下面的答案,但是顺便说一句,你的循环终止条件可能是错误的。如果你写了一个null,ObjectInputStream.readObject()只会返回null。在EOS时,它会抛出EOFException异常。 - user207421
2个回答

6

ObjectOutputStream.reset() 是你要寻找的内容。

它还可以防止内存耗尽,否则可能会发生。原因是 ObjectInput/OutputStream 类缓存了所有已通过它们发送的对象,这也防止这些对象被垃圾回收。这对于处理循环引用是必要的,并且在多次发送对象时也提高了性能。


2

我怀疑问题出在您修改了现有对象,然后重复使用现有的ObjectOutputStream。请在ObjectOutputStream上调用reset以有效地清除其对潜在修改过的对象的引用缓存。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接