我有以下代码,显示我的错误或误解 .
我发送了相同的列表,但修改了ObjectOutputStream . 一次为[0],另一次为[1] . 但是当我读到它时,我得到[0]两次 . 我认为这是因为我发送的是同一个对象而ObjectOutputStream必须以某种方式缓存它们 .
这是应该的,或者我应该提交错误?
import java.io.*;
import java.net.*;
import java.util.*;
public class OOS {
public static void main(String[] args) throws Exception {
Thread t1 = new Thread(new Runnable() {
public void run() {
try {
ServerSocket ss = new ServerSocket(12344);
Socket s= ss.accept();
ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
List same = new ArrayList();
same.add(0);
oos.writeObject(same);
same.clear();
same.add(1);
oos.writeObject(same);
} catch(Exception e) {
e.printStackTrace();
}
}
});
t1.start();
Socket s = new Socket("localhost", 12344);
ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
// outputs [0] as expected
System.out.println(ois.readObject());
// outputs [0], but expected [1]
System.out.println(ois.readObject());
System.exit(0);
}
}
3 回答
流有一个参考图,所以一次发送的对象不会在另一端给出两个对象,你只能得到一个 . 分别发送两次相同的对象会给你两次相同的实例(每个都有相同的数据 - 这就是你所看到的) .
如果要重置图形,请参阅reset()方法 .
Max是正确的,但您也可以使用:
请参阅下面的评论以获取警告
你可能想要的是:
否则,当流关闭或其缓冲区用完时,同一对象将被刷新两次 .
仅供参考,当你将对象反序列化时,让我们说
o1
和o2
,o1 != o2
.