Чтение нескольких объектов из файла

Есть ли правильный способ чтения объектов из файла с помощью ObjectInputStream. Примеры, которые я видел, похоже, полагаются на то, что исключение перехватывается, чтобы закончить чтение. Хотя это, возможно, работает, это не кажется чистым решением, поскольку исключение не должно происходить, если только в коде нет ошибки.

Пример 1


person starcorn    schedule 14.04.2013    source источник
comment
Если вы знаете количество объектов в файле, напишите код, использующий эту информацию. Если в файле есть неизвестное количество объектов, то подход Exception является правильным. Вы могли бы потенциально записать эту информацию в первый объект в файле...   -  person Boris the Spider    schedule 15.04.2013
comment
@bmorris591 bmorris591 Вам все равно придется иметь дело с EOFException, если первого объекта не было или счет был неправильным, например, если в процессе записи не удалось записать все объекты, для которых он предназначался.   -  person user207421    schedule 15.04.2013
comment
@EJP да, конечно, но это было бы исключительным случаем. Я думаю, что ОП возражает против использования Exception в качестве оператора потока управления.   -  person Boris the Spider    schedule 15.04.2013
comment
@bmorris На самом деле ОП, похоже, считает, что «исключения не должны происходить, если только в коде [что-то] не так», что приводит упомянутый вами «принцип» к его логическому, абсурдному заключению.   -  person user207421    schedule 15.04.2013
comment
Точка @EJP принята. Я все еще думаю, что в этом случае имеет смысл иметь дело с чтением данных минус Exceptions и обрабатывать их, когда что-то не так с вводом. Но вы абсолютно правы, исключения связаны с уходом от счастливого потока и не указывают на ошибки кодирования.   -  person Boris the Spider    schedule 15.04.2013
comment
@bmorris Случай, когда «что-то не так с вводом», в общем случае неотличим от случая, когда ввода просто больше нет. Невозможно переопределить «исключительный» таким образом, чтобы он включал один случай, а не другой.   -  person user207421    schedule 18.04.2013


Ответы (1)


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

person user207421    schedule 15.04.2013
comment
очень скучно, но, к сожалению, единственный способ, которым я думаю :/ - person starcorn; 15.04.2013
comment
Я не могу понять этот комментарий. Что «скучного» в перехвате исключения? - person user207421; 22.04.2013
comment
Ловить исключения не скучно. Я имел в виду, что я должен поймать исключение, когда оно достигло конца файла. - person starcorn; 23.04.2013
comment
@starcorn Перехватывать исключения в конце файла тоже не скучно. Если это то, что разработчики API определили, что вы должны делать, это то, что вы должны делать. На самом деле никого не волнует, считаете ли вы это скучным или нет. - person user207421; 24.04.2013
comment
Если это ваше мнение. Уф, успокойся. Я не говорил, что люди должны заботиться об этом :P - person starcorn; 26.04.2013
comment
Это не мое «мнение», это неизбежный факт. Это ваше непрошенное мнение, что это "скучно", вот в чем проблема. Он не согласен с разработчиками API. - person user207421; 26.04.2013
comment
Позвольте мне перефразировать это тогда. Очень жаль, что решением для него стала необходимость ловить EOFException. - person starcorn; 27.04.2013
comment
@starcom Никакое другое решение невозможно. Нет значения вне диапазона, которое могло бы быть возвращено. - person user207421; 07.02.2017