从文件中读取两个不同的对象

时间:2011-07-05 19:57:01

标签: java java-io

我正在尝试使用以下方法阅读2个arraylists。

 public static ArrayList<Contestant> readContestantsFromFile() throws IOException, ClassNotFoundException {
    FileInputStream fis = new FileInputStream("minos.dat");
    ObjectInputStream ois = new ObjectInputStream(fis);

    ArrayList<Contestant> contestants = (ArrayList<Contestant>) ois.readObject();

    ois.close();

    return contestants;
}
public static ArrayList<Times> readContestantsFromFile() throws IOException, ClassNotFoundException {
    FileInputStream fis = new FileInputStream("minos.dat");
    ObjectInputStream ois = new ObjectInputStream(fis);

    ArrayList<times> times = (ArrayList<Times>) ois.readObject();
    ois.close();
    return times;
}

这不起作用。它无法转换为我保存的第二个arraylist类型。那我该如何访问呢?我得到的确切错误是:

Exception in thread "main" java.lang.ClassCastException: com.deanchester.minos.model.Contestant cannot be cast to com.deanchester.minos.model.Times
at com.deanchester.minos.tests.testAddTime.main(testAddTime.java:31)

这指的是:

ArrayList<times> times = (ArrayList<Times>) ois.readObject();

那么如何从一个文件中读取2个不同的arraylists?

2 个答案:

答案 0 :(得分:0)

编写第二个文件时使用FileOutputStream fos = new FileOutputStream("minos.dat", true);true是参数“append”的值。否则,您将覆盖文件内容。这就是你两次阅读同一个集合的原因。

当您从文件中读取第二个集合时,您必须跳到第二个集合的开头。为此,您可以记住在第一阶段读取了多少字节,然后使用方法skip()

但更好的解决方案是只打开一次文件(我的意思是调用新的FileInputStream和新的FileOutputStream),然后将其传递给读取集合的方法。

答案 1 :(得分:0)

您可以使用ObjectInputStream从文件中读取两个不同的对象,但问题来自于您重新打开流,因此它从文件的开头开始,您有ArrayList<Contestant>然后你ArrayList<Times>。尝试一次完成所有操作并返回两个列表:

public static ContestantsAndTimes readObjectsFromFile() throws IOException, ClassNotFoundException {
    FileInputStream fis = new FileInputStream("minos.dat");
    ObjectInputStream ois = new ObjectInputStream(fis);

    ArrayList<Contestant> contestants = (ArrayList<Contestant>) ois.readObject();
    ArrayList<Times> times = (ArrayList<Times>) ois.readObject();
    ois.close();

    return new ContestantsAndTimes(contestants, times);
}