0

我希望能够将我的程序中创建的对象保存到文件中。我看过ObjectOutputStream上的一些教程,但问题是,它们只显示如何保存在主要方法中创建的特定对象。我想要的是,该程序自动保存每个创建的对象。 以我的程序中的组对象为例。这是添加方法:将对象保存到文件。自定义方法添加/删除对象

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."); 
    } 

} 

如何从文件中删除吗?我知道,我真的不能从文件中删除一个对象,但我怎样才能将空间清空?

预先感谢所有帮助:)

回答

1

如果你有机会获得第三方库,只需使用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); 
} 

} 
+0

不,我不能使用第三方库。我通读了这篇教程,但那仍然不能回答我的问题。我不想保存在main方法中创建的一个对象,而是保存使用addGroup方法创建的每个对象。 我该如何重写文件? 再次,我在哪里创建新的ObjectOutputStream? – Nino 2013-04-11 22:21:37

+0

我添加了一些代码。当添加一个对象时,它将保存,当一个组被删除时,该文件将被保存。 – jjhavokk 2013-04-11 22:48:44

+0

谢谢你的努力。但事实证明,这一切都不是必需的,因为我有一个数据库对象(它存储组对象),所以我只需要保存它。这比我想象的要容易得多。我想我必须保存我的程序中的每一个对象... – Nino 2013-04-12 00:27:22

0

这个问题可以在一个女士回答多种方式。有一些图书馆用于序列化,如XStream,它们可以帮助你序列化你的对象。还有一些图书馆可以帮助你manage persistence(即将对象写入文件并能够将它们读回到对象中)。

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

或者您可能只是想记录这样一个事实,即创建对象并从对象本身包含一些关于它们的基本信息。对于这一点,你想看看可用的日志库之一,像slf4jjava.util.logging,或log4j

至于从文件中删除的东西去,你基本上读取文件,并替换它没有你的一部分想要擦除。 This page有一些代码概述了实现该目标的策略。