我写了一个程序,不停地向文件写入一个类的对象,
可是这个对象改变后,写入文件里的对象竟然没有改变例如:
有一个类A
class A{
int x;}
A a = new A();
objOut = new ObjectOutputStream(new FileOutputStream("1.txt"));//线程1:不断向文件写入对象
while(true){
objOut.writeObject(a);
System.out.println(a.x);//用来验证a是否发生变化
}//线程2:不断改变对象a元素的值
while(true){
a.x++;
}非常奇怪的是,那句输出a.x的结果可以看出x的确发生变化了,可是写入文件里面的x却一直没有变化
一直都是a刚初始化那时候的值。
请问这是为什么?

解决方案 »

  1.   

    A a = new A();
    这句话结束,a的内存地址在你这段程序中就不变了,你写到文件里的应该是a的toString结果,a不变,那个值就不变。不管你把a.x改多少遍。
      

  2.   

    可是即使a的内存地址不变,它是对new A()的引用,而new A()里面的值不断改变,a的引用虽然没有,可是它指向的内容不断变化,为什么输出就没变?那么要怎么修改才能实现写出的对象会变化?
      

  3.   

    可是即使a的内存地址不变,它是对new A()的引用,而new A()里面的值不断改变,a的引用虽然没有,可是它指向的内容不断变化,为什么输出就没变?那么要怎么修改才能实现写出的对象会变化?//线程1:不断向文件写入对象
    while(true){
    a = new A();
    objOut.writeObject(a);
    }
      

  4.   

    可是即使a的内存地址不变,它是对new A()的引用,而new A()里面的值不断改变,a的引用虽然没有,可是它指向的内容不断变化,为什么输出就没变?那么要怎么修改才能实现写出的对象会变化?//线程1:不断向文件写入对象
    while(true){
    a = new A();
    objOut.writeObject(a);
    }
    不行啊,我调试得快疯了,代码太乱了贴出来怕你们晕了,能不能麻烦你给我写个最简单来的例子,如何把一个不断变化的对象发给对方,不停地发。我不管怎么试,不管对象怎么改变,对方收到的对象始终是第一次收到的那个。
      

  5.   

    可是即使a的内存地址不变,它是对new A()的引用,而new A()里面的值不断改变,a的引用虽然没有,可是它指向的内容不断变化,为什么输出就没变?那么要怎么修改才能实现写出的对象会变化?//线程1:不断向文件写入对象
    while(true){
    a = new A();
    objOut.writeObject(a);
    }
    不行啊,我调试得快疯了,代码太乱了贴出来怕你们晕了,能不能麻烦你给我写个最简单来的例子,如何把一个不断变化的对象发给对方,不停地发。我不管怎么试,不管对象怎么改变,对方收到的对象始终是第一次收到的那个。
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectOutputStream;
    import java.io.Serializable;public class FileObjectTest implements Serializable{

    double i=0;

    public FileObjectTest(){
    this.i = Math.random()*1000;
    } public static void main(String[] args) throws FileNotFoundException, IOException {
    // TODO Auto-generated method stub

    ObjectOutputStream objOut1 = new ObjectOutputStream(new FileOutputStream("/Users/user/csdn_test/1.txt"));
    ObjectOutputStream objOut2 = new ObjectOutputStream(new FileOutputStream("/Users/user/csdn_test/2.txt"));
    objOut1.writeObject(new FileObjectTest());
    objOut2.writeObject(new FileObjectTest()); }}
      

  6.   

    打印出来明显不是同一个对象
    user ~/csdn_test$cat 1.txt
    ¬sr%com.withiter.csdn.test.FileObjectTesKÓìADixp@3J£ŠG—user ~/csdn_test$cat 2.txt
    ¬sr%com.withiter.csdn.test.FileObjectTesKÓìADixp@Ž#{_VAuser ~/csdn_test$