I think you must check your variables (if you're reusing any) and initialization code.
The snippet you've posted seems to be fine, so I can't find the error on it.
Here goes a quite similar code that works. I hope it helps.
import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
public class Persistence {
public static void main(String[] args) throws Exception {
File f = new File("records.dat");
// f.delete();
if (!f.exists()){
f.createNewFile();
}
Persistence p = new Persistence();
if (p.peek() == null){
p.init(); //persist an empty list
}
p.saveNew(new Student("ID1","Some Value")); //must insert
p.saveNew(new Student("ID1","Some Other Value")); //must edit
p.saveNew(new Student("ID2","Some Value")); //must insert
ArrayList<Student> list = p.peek();
System.out.println(list);
}
private void save(ArrayList<Student> list) throws Exception{
FileOutputStream fos = new FileOutputStream("records.dat",false);//don't append
ObjectOutputStream out = new ObjectOutputStream(fos);
out.writeObject(list);
out.flush();
out.close();
fos.close();
}
private void init() throws Exception{
save(new ArrayList<Student>());
}
private ArrayList<Student> peek() throws Exception{
FileInputStream fis = new FileInputStream("records.dat");
try{
ObjectInputStream in = new ObjectInputStream(fis);
ArrayList<Student> students = (ArrayList<Student>) in.readObject();
return students;
}catch(EOFException eof){
return null;
}finally{
fis.close();
}
}
public void saveNew(Student s) throws Exception {
ArrayList<Student> students = peek();
int editIndex = -1;
for(int i=0;i<students.size();i++){
if (students.get(i).getID().equals(s.getID())){
editIndex = i;
break;
}
}
if (editIndex != -1){
students.set(editIndex, s); //replace
}else{
students.add(s); //add
}
save(students);
}
}
where
import java.io.Serializable;
public class Student implements Serializable{
private static final long serialVersionUID = 1L;
private String ID;
private String s;
public Student(String ID, String s) {
this.ID = ID;
this.s = s;
}
public String getID() {
return ID;
}
public void setID(String iD) {
ID = iD;
}
public String getS() {
return s;
}
public void setS(String s) {
this.s = s;
}
@Override
public String toString() {
return "Student [ID=" + ID + ", s=" + s + "]";
}
}