【问题标题】:Save Arraylist of Objects to External File Java将对象的 Arraylist 保存到外部文件 Java
【发布时间】:2017-06-29 06:55:26
【问题描述】:

我设置了一个 arrayList 来保存玩家数据。每个球员都包含几个元素,即球衣号码、名字、姓氏、首选位置、进球和助攻。我希望能够保存这些数据,这样当我重新启动程序时,数据仍然是完全相同的格式。从我读过的一些东西看来,序列化是要走的路吗?这是正确的还是有更好的方法?我是 Java 新手,所以任何例子都会很棒。我附上了我的代码的几个适用的sn-ps。

//创建数组列表

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

如果有人能解释如何将数据保存到文件中,然后在程序启动时从该文件重新加载数据,那就太好了。

【问题讨论】:

    标签: java serialization arraylist save deserialization


    【解决方案1】:

    要序列化列表,列表中的所有对象都必须是可序列化的。

    所以你的class blackTeam 必须实现 Serializable 接口。

    class blackTeam implements Serializable { ... }
    

    【讨论】:

      【解决方案2】:

      是的,似乎序列化是要走的路…… 对于具有嵌套对象的对象,将对象值存储在 java 数据库中可能是一个想法(例如 HSQLDB 和 H2)。这些数据库作为 jar 包含在项目中,据我所知,将值存储在文件中。然后表模型可以直接对应于对象层次结构......这将使存储和检索对象更容易,但对于简单对象来说可能是开销。

      对于更大和嵌套的对象,我建议评估这个替代方案,因为我相信记住(不要阻止我)序列化有它的限制。

      这里有两个关于谷歌搜索“java store object as file”的链接 link1

      link2

      【讨论】:

        【解决方案3】:

        序列化是将对象保存到文件所需的路径。这个here 是一篇关于如何做到这一点的好文章,以及它的例子。

        此外,您对类名称的命名约定不正确。它应该是 UpperCamelCased 而不是 camelCased。但是,您的变量会检查出来。

        【讨论】:

          【解决方案4】:

          您必须决定要序列化数据的方式。您可以将它与 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

          【讨论】:

          • 我实现了可序列化,但在运行代码时收到错误消息“java.io.NotSerializableException: javax.swing.GroupLayout”,你知道这是为什么吗?至于您将文件读入对象的示例;如果我是正确的,您的示例将其保存为列表,而不是我想要的 arrayList。我也可以通过在程序启动时运行的代码中执行“loadTeam():”来调用它吗? @Orin
          • 那是因为GroupLayout 对象不可序列化。因此,如果您在对象内部有它,除非您将其标记为瞬态,否则您无法序列化它。是的,您需要在调用程序启动时调用loadTeam(),这将返回您想要的对象。是的,它将它保存为List,但ArrayListList 的实现。如果您真的愿意,可以将我的示例与ArrayList 互换。 @ckorvee
          猜你喜欢
          • 2018-01-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-08
          • 2014-05-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多