Чтение двух разных объектов из файла - PullRequest
0 голосов
/ 05 июля 2011

Я пытаюсь прочитать 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;
}

Бит, это не работает. Он не может быть преобразован во второй тип массива, который я сохранил. Так как я могу получить доступ к этому? Точная ошибка, которую я получил, была такой:

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 разных массива из одного файла?

Ответы [ 2 ]

0 голосов
/ 06 июля 2011

Вы можете прочитать два разных объекта из файла, используя 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);
}
0 голосов
/ 06 июля 2011

Используйте FileOutputStream fos = new FileOutputStream("minos.dat", true); при записи второго файла.true является значением аргумента "добавить".В противном случае вы переопределяете содержимое файла.По этой причине вы читаете одну и ту же коллекцию дважды.

Когда вы читаете вторую коллекцию из файла, вы должны перейти к началу второй коллекции.Для этого вы можете вспомнить, сколько байтов вы прочитали на первом этапе, а затем использовать метод skip().

Но лучшее решение - открыть файл только один раз (я имею в виду вызов нового FileInputStream и нового FileOutputStream) только один раз, а затем передать его методам, которые читают коллекции.

...