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有一些代碼概述了實現該目標的策略。