2017-02-10 82 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。但是,你的变量检出。