Закрытие ObjectOutputStream / ObjectInputStream и NotActiveException
В задаче есть условия:
2. В методе writeObject(ObjectOutputStream out) не должен быть вызван метод close у потока полученного в качестве параметра.
3. В методе readObject(ObjectInputStream in) не должен быть вызван метод close у потока полученного в качестве параметра.
Приведу код этих методов:
private void writeObject(ObjectOutputStream out) throws IOException {
out.defaultWriteObject();
out.close();
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();
stream = new FileOutputStream(fileName, true);
in.close();
}
Вроде бы сами условия выглядят логично — если мы закроем потоки сериализации в методах записи/чтения объектов, то последующая работа с этими потокам (а соответственно и последующая сериализация) будет невозможна.
В то же время я оставил методы close потоков в методах writeObject / readObject и написал такой код тестирования в main:
public static void main(String[] args) throws Exception {
Solution solution1 = new Solution("1.txt");
Solution solution2 = new Solution("2.txt");
Solution solution3 = new Solution("3.txt");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(solution1);
oos.writeObject(solution2);
oos.close();
baos.close();
oos.writeObject(solution3);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
Solution newSolution1 = (Solution) ois.readObject();
Solution newSolution2 = (Solution) ois.readObject();
ois.close();
bais.close();
Solution newSolution3 = (Solution) ois.readObject();
}К моему удивлению этот код полностью оказывается рабочим.
Как видим, после записи первого объекта oos.writeObject(solution1); (при этом по сути в методе writeObject должен закрываться поток сериализации) мы спокойно можем сериализовать второй объект oos.writeObject(solution2);
Хотя в этом месте я ожидал получить NotActiveException
Более того — после сериализации второго объекта я явно в main закрываю потоки записи:oos.close();
baos.close();и после этого спокойно сериализую третий объект:oos.writeObject(solution3);
Далее все эти объекты без ошибок десериализуются и можно продолжать с ними работать (хотя в процессе десериализации я опять же неоднократно пытаюсь закрыть потоки из которых читаю).
Так и не смог разобраться - получается методы закрытия потоков ObjectOutputStream.close и ObjectInputStream.close не вот прям сразу моментально закрывают потоки сериализации? Или вообще их не закрывают?