我正在尝试使用以下方法阅读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?
答案 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);
}