我创建了一个对象,然后将其添加到ArrayList中。然后我使用ObjectOutputStream将这个arraylist保存到.dat文件中。我知道对象已经正确创建,因为程序中的下一个屏幕直接从对象加载,然后可以从文件中正确读取对象。我遇到的问题是该对象似乎正在保存,但它不愿意被编辑。它不是在arraylist中编辑对象,而是每次都创建一个新对象并再次保存。
下面的代码显示了每次有人完成最后一个屏幕时执行的保存功能。我试图这样做它将检查学生是否已经存在于数组中,如果是这样,只需编辑该对象。如果学生不存在,我希望它采用selectedStudent(用于所有GUI功能的对象)并将其添加到数组“students”并将数组写入文件,覆盖所有以前的数据。
@SuppressWarnings("unchecked")
public static void saveNew() throws ClassNotFoundException, IOException{
int exists = -1;
try{
FileInputStream fis = new FileInputStream("records.dat");
ObjectInputStream in = new ObjectInputStream(fis);
students = (ArrayList<Student>) in.readObject();
in.close();
fis.close();
}
catch(IOException e){
e.printStackTrace();
}
try{
FileOutputStream fos = new FileOutputStream("records.dat", false);
ObjectOutputStream out = new ObjectOutputStream(fos);
for(int i = 0; i<students.size(); i++){
if(students.get(i).getID().equals(selectedStudent.getID())){
exists = i;
}
}
if(exists<0){
students.add(selectedStudent);
}
else{
students.set(i, selectedStudent);
}
out.writeObject(students);
out.close();
}
catch(IOException e){
e.printStackTrace();
}
}
编辑:我注意到存在的变量没有用于搜索错误第一的对象,但是我仍然遇到这样的问题:在第二次调用该方法之前,保存的对象不会被更改。它似乎在它再次运行时找到它,但是当它第一次运行时它将只是创建一个具有已编辑名称的新学生。
例如,创建并保存第一个学生。第二个学生是创建和保存的。当正在编辑第二个学生时(不关闭程序并重新启动),它将不是在文件中编辑对象,而是在第一个学生对象的正下方创建一个具有相同信息的新学生对象。如果第二次运行编辑功能,则会正确编辑第二个学生文件,但保留第一个原始文件。
答案 0 :(得分:0)
首先,我会编辑这些行
if(students.get(i).getID().equals(selectedStudent.getID())){
exists = i;
}
到
if(students.get(i).getID().equals(selectedStudent.getID())){
System.out.println ("Got it");
exists = i;
break;
}
只是为了确保它正常运作。
另外,您想要将i
的使用更改为exists
else{
students.set(i, selectedStudent); // change to exists
}
答案 1 :(得分:0)
我认为你必须检查你的变量(如果你正在重复使用)和初始化代码。
您发布的代码段似乎没问题,所以我找不到错误。
这是一个非常相似的代码。我希望它有所帮助。
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);
}
}
,其中
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 + "]";
}
}