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保存功能不会覆盖的主要内容,如果未能解决你的问题,请参考以下文章

Silverlight XML Save 不会覆盖整个文件

覆盖文件而不会有损坏文件的风险

Shopify 在选择变体时触发功能,但不会覆盖现有功能

VBA:保存而不覆盖现有文件

使用覆盖将图像保存到文档目录

图像不会覆盖相同的名称