【问题标题】:Saving/loading multiple ArrayLists into one file in Java在 Java 中将多个 ArrayList 保存/加载到一个文件中
【发布时间】:2016-04-13 03:20:28
【问题描述】:

目前我有一个程序可以从文件中保存和加载“变量”类型的 ArrayList。但是,我希望能够从一个文件中保存和加载不同的对象(不同类的实例,例如“变量”、“函数”..等)。这是我现在拥有的代码:

 public SaveState(){
    ObjectOutputStream out = null;
    try {
        out = new ObjectOutputStream(new FileOutputStream("vars.stt"));
    } catch (IOException e) {
        e.printStackTrace();
    }
    ArrayList<Variables> vars = new ArrayList<>();
    vars.add(new Variables("g", 5));
    vars.add(new Variables("f", -3.12));
    try {
        out.writeObject(vars);
        out.flush();
        out.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

public LoadState(){
    ObjectInputStream in = null;
    try {
        in = new ObjectInputStream(new FileInputStream("vars.stt"));
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        //final Object o = in.readObject();
        final ArrayList<Variables> vars = (ArrayList<Variables>) in.readObject();
        System.out.println(vars.toString());
    } catch (IOException | ClassNotFoundException e) {
        e.printStackTrace();
    }
}

此代码仅允许我从文件中加载一种对象类型。有没有办法以这种方式保存/加载多种对象类型?

【问题讨论】:

  • 你没有尝试为函数和变量创建一个基类并使用基类类型的数组列表吗?
  • @ImeshaSudasingha 老实说,我不确定我是否能够做到这一点,这需要我重构很多代码(数百行)。有没有其他解决方案。
  • 不,您可以创建一些基类(例如“ProgramElement”),它们只是从中扩展变量和函数类。无需重构代码。
  • @ImeshaSudasingha 那么,如果我有“变量”、“函数”和“列表”类,我将如何从一个类中扩展所有 3 个类?
  • 为什么不使用 Object 类作为“基类”。你可以使用多态性。

标签: java serialization arraylist


【解决方案1】:

您可以简单地使用包含变量或函数的数组列表的映射。地图在性能方面也不错。

    Map<String, List> map = new HashMap<String, List>();
    map.put("variable", arralist1);
    map.put("functions", arralist2);
    map.put("list", arralist3);

【讨论】:

  • 所以即使 ArrayLists 是不同类型的,这也能工作?
  • 是的。或者你可以使用泛型使其参数化。
  • 非常感谢您提供此解决方案。效果很好
【解决方案2】:

像这样创建一个类层次结构:

//base class. No need to write any content
class ProgramElement {

}

//your variables class
class Variables extends ProgramElement {
    //your code
}

//your functions class
class Functions extends ProgramElement {
    //your code
}

//your lists class
class Lists extends ProgramElement {
    //your code
}

然后使用 ProgramElement 类型的 ArrayList。记住 List 这里不是你的 Lists 类。是java的List接口。

List<ProgramElement> elements = new ArrayList<>();
elements.add(aFunction); //add function object
elements.add(aList);  //lists object
elements.add(aVariable); //variables object

注意:您可以通过使用 Object 类型的 List 来实现相同的目的。但不建议这样做,因为这不是一个好习惯。

【讨论】:

  • 非常感谢,起初我以为您是在告诉我按照“class ProgramElement extends Variables, Functions, Lists { }”的方式做一些事情,这就是我感到困惑的地方。再次感谢您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-19
  • 1970-01-01
  • 1970-01-01
  • 2014-05-11
  • 1970-01-01
  • 1970-01-01
  • 2019-03-21
相关资源
最近更新 更多