【问题标题】:Saving Objects to File. Custom methods to add/remove Object将对象保存到文件。添加/删除对象的自定义方法
【发布时间】:2013-04-11 21:51:01
【问题描述】:

我希望能够将在我的程序中创建的对象保存到文件中。我看过一些关于 ObjectOutputStream 的教程,但问题是,它们只展示了如何保存在 main 方法中创建的特定对象。我想要的是,程序会自动保存每个创建的对象。 以我程序中的 Group Object 为例。这是添加方法:

public void addGroup(int gid, String groupname) {
    Group newgroup = new Group(gid, groupname);
    if (!Groups.contains(newgroup)) {
        Groups.add(newgroup);
        return;
    }else
        JOptionPane.showMessageDialog(null, "Group with ID " + gid
                + " already exists!", "Error",
                JOptionPane.WARNING_MESSAGE);
}

它是我的数据库类的一部分。我想自动将每个创建的组保存到文件中。这将如何完成?在数据库类中,我在哪里声明新文件?在主要方法中?

我的第二个问题是,如果我删除一个组,使用 remove 方法:

public void removeGroup(int gid) {

    if (!Groups.remove(new Group(gid, null))) {
        JOptionPane.showMessageDialog(null, "Group with ID[" + gid
                + "] not present. System unchanged.");
    }

}

如何从文件中删除它?我知道,我不能真正从文件中删除一个对象,但是我将如何清空这个空间?

提前感谢所有帮助:)

【问题讨论】:

    标签: java file-io fileinputstream objectoutputstream file-access


    【解决方案1】:

    如果您可以访问 3rd 方库,只需使用 XStream 序列化为 XML。如果没有,可以序列化保存。

    按照this: http://www.tutorialspoint.com/java/java_serialization.htm之类的序列化教程进行操作

    我认为您不想尝试从文件中删除任何内容.. 只需在进行更改时重写它即可。制作几个方法来读取文件,并序列化对象并保存到文件。这是一个例子

    Group.java

    import java.io.Serializable;
    
    public class Group implements Serializable
    {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    
    private String guid;
    private String groupName;
    
    public Group(String guid, String groupName) {
        super();
        this.guid = guid;
        this.groupName = groupName;
    }
    
    public String getGuid() {
        return guid;
    }
    public void setGuid(String guid) {
        this.guid = guid;
    }
    public String getGroupName() {
        return groupName;
    }
    public void setGroupName(String groupName) {
        this.groupName = groupName;
    }
    }
    

    GroupData.java

    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.util.ArrayList;
    
    public class GroupData extends ArrayList<Group>
    {
    private static final long serialVersionUID = 1L;
    
    public GroupData(){}
    
    public void addGroup(Group group)
    {
        this.add(group);
        saveGroupData();
    }
    
    public void removeGroup(Group group)
    {
        this.remove(group);
        saveGroupData();
    }
    
    public void saveGroupData()
    {
          try
          {
             FileOutputStream fileOut = new FileOutputStream("C:\\Users\\tester\\group-data.ser");
             ObjectOutputStream out = new ObjectOutputStream(fileOut);
    
             out.writeObject(this);
    
             out.close();
             fileOut.close();
          }
          catch(IOException i)
          {
              i.printStackTrace();
          }
    }
    
    public void loadGroupData()
    {
          try
          {
             FileInputStream fileIn = new FileInputStream("C:\\Users\\tester\\group-data.ser");
             ObjectInputStream in = new ObjectInputStream(fileIn);
             GroupData tmp = (GroupData) in.readObject();
    
             this.clear();
             this.addAll(tmp);
    
             in.close();
             fileIn.close();
          }
          catch(IOException i)
          {
             i.printStackTrace();
             return;
          }
          catch(ClassNotFoundException c)
          {
             c.printStackTrace();
             return;
          }
    }
    }
    

    这是一个测试

    TestGroup.java

    public class TestGroup {
    
    /**
     * @param args
     */
    public static void main(String[] args) 
    {
    
        Group group1 = new Group("123", "testers");
        Group group2 = new Group("456", "programmers");
        Group group3 = new Group("687", "students");
    
        GroupData groupData = new GroupData();
    
        groupData.add(group1);
        groupData.add(group2);
        groupData.add(group3);
    
        groupData.remove(group3);
    }
    
    }
    

    【讨论】:

    • 不,我不能使用第 3 方库。我通读了教程,但这仍然没有回答我的问题。我不想保存在 main 方法中创建的一个对象,而是保存使用 addGroup 方法创建的每个对象。如何重写文件?再说一次,我在哪里创建新的 ObjectOutputStream?
    • 我添加了一些代码。添加对象时保存,删除组时保存文件。
    • 感谢您的努力。但事实证明,这一切都不是必需的,因为我有一个数据库对象(它存储组对象),所以我只需要保存它。这一切都比我想象的要容易。我以为我必须保存程序中的每一个对象...
    【解决方案2】:

    可以通过多种方式回答这个问题。有一些像XStream 这样的库可以帮助你序列化你的对象。还有一些库可以帮助您manage persistence(即将对象写入文件并能够将它们读回对象)。

    对于一些简单的事情,你可能只想写一个simple text file,或者你可能想要那个文件to be binary

    或者您可能只想记录对象已创建的事实,并从对象本身中包含一些关于它们的基本信息。为此,您需要查看可用的日志库之一,例如 slf4jjava.util.logginglog4j

    就从文件中删除内容而言,您实际上是在读取文件并在没有要删除的部分的情况下替换它。 This page 有一些代码概述了实现这一目标的策略。

    【讨论】:

      猜你喜欢
      • 2016-01-05
      • 1970-01-01
      • 1970-01-01
      • 2013-05-24
      • 2016-02-17
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多