我正在尝试使用ArrayList来记录Object更改为文件时的状态。我每次更改时都会将对象添加到文件中。当我在进程完成时回顾文件时,它只有对象的最新值的多个副本。我知道这可能是因为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);
答案 0 :(得分:0)
在您的代码中
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);
在数组列表中多次添加同一个对象,这会使列表中的所有条目都指向设置了最新值的同一对象。
ArrayList <Reel> reels = new ArrayList<Reel> () ;
Reel reel = new Reel();
reel.name = ...
// Code
reels.add(reel);
每次都应该创建一个不同的对象:
reel = new Reel(); // NEW OBJECT
reel.name = ...;
// Code
reels.add(reel);
答案 1 :(得分:0)
经过多次思考,搜索和实验,我找到了解决这个问题的方法。我需要做的就是将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;
}
和&#39; reels.add(卷轴);&#39;行改为
reels.add((Reel)reel.clone());