我的以下代码显示了我的错误或误解。
我发送了相同的列表,但通过 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<Integer> same = new ArrayList<Integer>();
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);
}
}
最佳答案
流有一个引用图,因此发送两次的对象不会在另一端给出两个对象,您只会得到一个。分别发送相同的对象两次将为您提供相同的实例两次(每个实例都具有相同的数据 - 这就是您所看到的)。
如果您想重置图表,请参阅reset()方法。
关于java - 通过 ObjectOutputStream 发送相同但已修改的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61320457/