Java保存功能不会覆盖
Posted
技术标签:
【中文标题】Java保存功能不会覆盖【英文标题】:Java save function won't overwrite 【发布时间】:2014-02-18 02:50:44 【问题描述】:我创建了一个对象,然后将其添加到 ArrayList 中。然后,我使用 ObjectOutputStream 将此数组列表保存到 .dat 文件中。我知道对象已正确创建,因为程序中的下一个屏幕直接从对象加载,之后可以从文件中正确读取对象。我遇到的问题是该对象似乎正在保存,但它不愿意被编辑。它不是在 arraylist 中编辑对象,而是创建一个新对象并每次再次保存它。
下面的代码显示了每次有人完成最后一屏时执行的保存功能。我正在尝试让它检查学生是否已经存在于数组中,如果存在,只需编辑对象。如果学生不存在,我希望它采用 selectedStudent(用于所有 GUI 功能的对象)并将其添加到数组“学生”并将数组写入文件,覆盖所有以前的数据。
@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();
编辑:我注意到变量存在没有被用于搜索第一个错误的对象,但我仍然有一个问题,即在第二次调用该方法之前不会更改保存的对象。再次运行时似乎会找到它,但是当它第一次运行时,它只会创建一个具有编辑名称的新学生。
例如,创建并保存了第一个学生。第二个学生是被创建和保存的。当第二个学生正在被编辑(不关闭程序并重新启动)时,它不会编辑文件中的对象,而是在第一个学生的正下方创建一个具有相同信息的新学生对象。如果第二次运行编辑功能,第二个学生文件被正确编辑,但第一个学生文件保持原样。
【问题讨论】:
这段代码无法编译。 它是整个代码的示例片段。该代码包含很多如果没有我发布所有相关类就无法运行的东西。就目前而言,其他一切都在运行并且工作正常,我只是在创建保存方法时遇到了问题。我有它,所以每次在最后一个(和非可选的)菜单上点击保存按钮以进行编辑和创建时,都会调用保存方法。因此,此代码将在每次将信息更改为对象 selectedStudent 结束时运行。 【参考方案1】:首先我会编辑这些行
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
【讨论】:
我注意到该变量存在没有被用于搜索第一个错误的对象,但我仍然有一个问题,即在调用该方法之前不会更改保存的对象时间。再次运行时似乎会找到它,但是当它第一次运行时,它只会创建一个具有编辑名称的新学生。【参考方案2】:我认为您必须检查您的变量(如果您正在重用任何变量)和初始化代码。
你贴的sn-p好像没问题,所以我找不到错误。
这里有一个非常相似的代码。希望对你有帮助。
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 + "]";
【讨论】:
以上是关于Java保存功能不会覆盖的主要内容,如果未能解决你的问题,请参考以下文章