Неожиданное исключение EOF

Я пытаюсь читать / записывать ArrayList пользовательских (сериализуемых) объектов в файл. Он работает как ожидалось, за исключением одного: я получаю EOFexception при чтении файла. Вот мой код:

class FileHandler {
    private final String FILENAME = "storage.txt";

    ArrayList<Plane> readFromFile(Context context) {
        ArrayList<Plane> returnList = new ArrayList<>();
        Plane temp;

        try {
            FileInputStream fileInputStream = context.openFileInput(FILENAME);
            ObjectInputStream objectInStream = new ObjectInputStream(fileInputStream);


            while ((temp = (Plane)objectInStream.readObject()) != null) {
                returnList.add(temp);
            }

            objectInStream.close();
        }
        catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }

        return returnList;
    }

    void writeToFile(ArrayList<Plane> inData, Context context) {
        FileOutputStream fileOutputStream;
        ObjectOutputStream outputStream;

        try {
            fileOutputStream = context.openFileOutput(FILENAME, Context.MODE_PRIVATE);
            outputStream = new ObjectOutputStream(fileOutputStream);

            for (Plane p: inData) {
                outputStream.writeObject(p);
            }

            outputStream.close();
            fileOutputStream.close();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Файл записывается и считывается по назначению, но при чтении файла я получаю исключение EOF. Не знаю, почему. Я думал, что мой цикл будет уверен, что этого не произойдет?

  1. Почему я получаю это исключение?
  2. Плоскость сериализуема. Можно ли читать и записывать в файл, если я изменил Plane, чтобы быть parcable вместо этого? (Как?)

java,android,

0

Ответов: 1


0

Любая попытка считывания данных объекта, которая превышает границы пользовательских данных, написанных соответствующим методом writeObject, вызовет исключение OptionalDataException с значением eof field для истины. Необъектные чтения, которые превышают конец выделенных данных, будут отражать конец данных так же, как они указывают конец потока: пошаговые чтения возвращают -1 в качестве прочитанного байта или количества прочитанных байтов и примитивных reads выдаст EOFExceptions. Если нет соответствующего метода writeObject, то конец сериализованных данных по умолчанию обозначает конец выделенных данных.

Это то, что я нашел на https://docs.oracle.com/javase/7/docs/api/java/io/ObjectInputStream.html

Последняя попытка считывания данных происходит, когда нет данных. Условие while-loop на самом деле не проверяет, есть ли данные для чтения или нет. Он пытается это прочитать.

Java, Android,
Похожие вопросы