2017-02-10 33 views
0

我有一個arrayList設置爲保存玩家數據。每名球員都有幾個元素,分別是球衣號碼,名字,姓氏,首選位置,進球和助攻。我希望能夠保存這些數據,以便在重新啓動程序時數據的格式仍然完全相同。從我讀過的一些東西看,序列化看起來是一種方式?這是正確的還是有更好的方法?我是Java的新手,所以任何示例都會很棒。我附上了我的代碼的幾個適用的片段。將對象的Arraylist保存到外部文件Java

//創建ArrayList的

public class LeagueDatabase extends javax.swing.JFrame { 
    ArrayList <blackTeam> blackTeam = new ArrayList <blackTeam>(); 

//類是如何構成的

class blackTeam { 
    int goals, assists; 
    String jerseyNum, firstName, lastName, prefPosition; 

    blackTeam (String _jerseyNum, String _firstName, String _lastName, String _prefPosition, int _goals, int _assists) { 
     jerseyNum = _jerseyNum; 
     firstName = _firstName; 
     lastName = _lastName; 
     prefPosition = _prefPosition; 
     goals = _goals; 
     assists = _assists; 
    } 
} 

//數據是如何添加

black = new blackTeam(jerseyNum, firstName, lastName, prefPosition, goals, assists); 
blackTeam.add(black); 

//我有什麼迄今保存數據

addWindowListener(new WindowAdapter() { 
     public void windowClosing(WindowEvent e) { 
      try{ 
       FileOutputStream fos= new FileOutputStream("blackTeam"); 
       ObjectOutputStream oos= new ObjectOutputStream(fos); 
       oos.writeObject(blackTeam); 
       oos.close(); 
       fos.close(); 
      }catch(IOException ioe){ 
       ioe.printStackTrace(); 
      } 
      //close program 
      System.exit(0); 
     } 
    }); 

如果有人可以解釋如何將數據保存到一個文件,然後該程序啓動時從該文件重新加載數據,這將是巨大的。

回答

2

要序列化列表,列出的所有對象都必須是可序列化的。

所以你class blackTeam必須實現Serializable接口。

class blackTeam implements Serializable { ... } 
0

是的,它似乎是序列化是去... 對於嵌套對象對象可能是儲存在一個Java的數據庫(實例HSQLDB AMD H2)的對象的值的想法的方式。這些數據庫作爲jar包含在項目中,並且據我記憶將值存儲在文件中。表模型然後可以直接對應於對象層次結構...將使存儲和檢索對象更容易,但可能是簡單對象的開銷。

做大嵌套的對象,我建議,以評估這種替代,因爲我相信要記住(不要把我抱起來研究這個)是序列化有它的限制。

這裏就谷歌搜索「Java軟件商店對象文件」 link1

link2

0

兩個環節你必須決定你想要序列數據哪種方式。您可以將其與Java內置的序列化中的Java一起使用,您必須在其中實現與blackTeam類的接口Serializable

public class blackTeam implements Serializable { 

    //... 

} 

現在你已經有一個方法來保存文件,你只需要一個方法把文件讀入一個對象。

public List<blackTeam> loadTeam() throws IOException, ClassNotFoundException 
{ 
    FileInputStream fileIn = null; 
    ObjectInputStream in = null; 
    List<blackTeam> teams = null; 
    try 
    { 
     fileIn = new FileInputStream("blackTeam"); 
     in = new ObjectInputStream(fileIn); 
     teams = (List<blackTeam>)in.readObject(); 

    } 
    finally 
    { 
     if(fileIn != null) 
      fileIn.close(); 
     if(in != null) 
      in.close(); 
    } 
    return teams; 
} 

請注意,還有其他方法可以序列化對象。您可以使用JSON表示法並將對象保存爲JSON格式以便更易於傳輸。還有,你可以用來做JSON格式,如Jackson

+0

我實現了序列化,但我得到的錯誤信息「java.io.NotSerializableException:javax.swing.GroupLayout」當代碼運行時,你知道這是爲什麼?至於你將文件讀入對象的例子;如果我是正確的,你的例子將它保存爲一個列表,而不是像我想要的那樣的一個arrayList。我也可以通過在程序啓動時運行的代碼中執行「loadTeam():」來調用它。 @Orin – ckorvee

+0

這是因爲'GroupLayout'對象不是可序列化的。因此,如果你的對象內有這樣的內容,除非將其標記爲瞬態,否則無法序列化它。是的,當你調用程序啓動時,你需要調用'loadTeam()',這會返回你想要的對象。是的,它將它保存爲List,但ArrayList是List的一個實現。如果你真的想,你可以用'ArrayList'來交換我的例子。 @ckorvee – Orin

0

序列化是你需要去到你的對象保存到一個文件的路徑外部庫。這個here是一篇關於如何做的好文章,以及它的例子。

此外,對於類名的命名約定是不正確的。它應該是UpperCamelCased而不是camelCased。但是,你的變量檢出。