Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ArrayList序列化文件写入使用ID并错误记录更改项_Java_Serialization_File Io_Arraylist - Fatal编程技术网

Java ArrayList序列化文件写入使用ID并错误记录更改项

Java ArrayList序列化文件写入使用ID并错误记录更改项,java,serialization,file-io,arraylist,Java,Serialization,File Io,Arraylist,我试图使用ArrayList记录对象更改为文件时的状态。每次对象更改时,我都会将其添加到文件中。当我在进程完成后回顾文件时,它只包含对象最新值的多个副本。我理解这可能是因为OutStream类使用了对对象的单个引用。这对于数据流来说是好的,但是对于文件输出来说是无用的。有没有办法解决这个问题 ArrayList <Reel> reels = new ArrayList<Reel> () ; Reel reel = new Reel(); r

我试图使用ArrayList记录对象更改为文件时的状态。每次对象更改时,我都会将其添加到文件中。当我在进程完成后回顾文件时,它只包含对象最新值的多个副本。我理解这可能是因为OutStream类使用了对对象的单个引用。这对于数据流来说是好的,但是对于文件输出来说是无用的。有没有办法解决这个问题

    ArrayList <Reel> reels = new ArrayList<Reel> () ;
    Reel reel = new Reel();
        reel.name = "Default";
        reel.innerDiam = 125;
        reel.outerDiam = 200;
        reel.leftEdge = 150;
        reel.rightEdge = 300;
        reel.saved = false;     //reels = new Reel[100];
    reels.add(reel);
        reel.name = "LRF1A";
        reel.outerDiam = 225;
    reels.add(reel);    
    try { 
        ObjectInputStream reeliStream = new ObjectInputStream(new FileInputStream("Reels.ser"));
        reels = (ArrayList<Reel>) reeliStream.readObject();
    } catch (Exception eI) {
    System.out.println("Creating new Reels Repository File");
        try {
            ObjectOutputStream reeloStream = new ObjectOutputStream(new FileOutputStream("Reels.ser"));
            reeloStream.writeObject(reels);
        } catch (Exception eO){
            System.out.println("Failed to created new Reels Repository file.");
        }// try Read Reels
    }//Try Write Reels
    reel = reels.get(1);
ArrayList-revels=new-ArrayList();
拨禾轮=新拨禾轮();
revel.name=“默认”;
卷筒内径=125;
卷筒外线=200;
reel.leftEdge=150;
Reveel.rightEdge=300;
reel.saved=错误//卷轴=新卷轴[100];
卷轴。添加(卷轴);
reveel.name=“LRF1A”;
卷筒外线=225;
卷轴。添加(卷轴);
试试{
ObjectInputStream reeliStream=新ObjectInputStream(新文件输入流(“Reels.ser”));
reels=(ArrayList)reeliStream.readObject();
}捕获(异常eI){
System.out.println(“创建新的卷存储库文件”);
试一试{
ObjectOutputStream reeloStream=新的ObjectOutputStream(新文件输出流(“Reels.ser”));
reeloStream.writeObject(卷);
}捕获(异常eO){
System.out.println(“未能创建新的卷存储库文件”);
}//试读卷轴
}//试着写卷轴
卷筒=卷筒。获取(1);
在您的代码中

ArrayList <Reel> reels = new ArrayList<Reel> () ;
Reel reel = new Reel();
    reel.name = "Default";
    reel.innerDiam = 125;
    reel.outerDiam = 200;
    reel.leftEdge = 150;
    reel.rightEdge = 300;
    reel.saved = false;     //reels = new Reel[100];
reels.add(reel);
    reel.name = "LRF1A";
    reel.outerDiam = 225;
reels.add(reel);  

经过深思熟虑、探索和实验,我找到了解决这个问题的办法。我所需要做的就是将reel对象的克隆添加到ArrayList中。克隆是深度复制和临时的,因为实际克隆的对象只存在于Reels类的调用方法中

我将Reel类声明更改为

public class Reel implements Cloneable{
克隆方法已添加到该类中

    public Object clone(){
    Reel cloneReel;
    try{
        cloneReel = (Reel) super.clone();
    }
    catch (CloneNotSupportedException e){
        return null;  //never happens !?!
    }
    return cloneReel;
}
和“卷轴。添加(卷轴);”行已更改为

reels.add((Reel)reel.clone());

谢谢你。每次我都必须为“reel”实例生成不同的名称以避免冲突,这将是一个问题,因为其他类会设置此对象的值。我在某处看到一个设置“reveel=null”的建议,这会产生相同的冲突问题。我想做的是reel.destroy,但java不支持。。。。嘿嘿。
    public Object clone(){
    Reel cloneReel;
    try{
        cloneReel = (Reel) super.clone();
    }
    catch (CloneNotSupportedException e){
        return null;  //never happens !?!
    }
    return cloneReel;
}
reels.add((Reel)reel.clone());