Spec-Zone .ru
спецификации, руководства, описания, API
След: Существенные Классы
Урок: Основной ввод-вывод
Раздел: Потоки ввода-вывода
Объектные Потоки
Домашняя страница > Существенные Классы > Основной ввод-вывод

Объектные Потоки

Так же, как потоки данных поддерживают ввод-вывод примитивных типов данных, объектные потоки поддерживают ввод-вывод объектов. Больше всего, но не все, стандартные классы поддерживают сериализацию своих объектов. Те, которые действительно реализуют интерфейс маркера Serializable.

Объектные потоковые классы ObjectInputStream и ObjectOutputStream. Эти классы реализация ObjectInput и ObjectOutput, которые являются подынтерфейсами DataInput и DataOutput. Это означает, что все примитивные методы ввода-вывода данных, покрытые Потоками данных, также реализуются в объектных потоках. Таким образом, объектный поток может содержать смесь примитивных и объектных значений. ObjectStreams пример иллюстрирует это. ObjectStreams создает то же самое приложение как DataStreams, с несколькими изменениями. Во-первых, цены теперь BigDecimalобъекты, чтобы лучше представить дробные значения. Во-вторых, a Calendar объект пишется файлу данных, указывая на дату счета.

Если readObject() не возвращает объектный ожидаемый тип, пытаясь бросить его к корректному типу может бросить a ClassNotFoundException. В этом простом примере, который не может произойти, таким образом, мы не пытаемся поймать исключение. Вместо этого мы уведомляем компилятор, что знаем о проблеме, добавляя ClassNotFoundException к main метод throws пункт.

Вывод и Ввод Составных объектов

writeObject и readObject методы просты использовать, но они содержат немного очень сложной логики управления объектами. Это не важно для class как Календарь, который только инкапсулирует примитивные значения. Но много объектов содержат ссылки на другие объекты. Если readObject должен воссоздать объект от потока, это должно быть в состоянии воссоздать все объекты исходный упомянутый объект. У этих дополнительных объектов могли бы быть свои собственные ссылки и так далее. В этой ситуации, writeObject пересекает всю сеть ссылок на объект и пишет все объекты в той сети на поток. Таким образом единственный вызов writeObject может заставить большое количество объектов быть записанным потоку.

Это демонстрируется в следующем числе, где writeObject вызывается, чтобы записать единственный объект, названный a. Этот объект содержит ссылки на объекты b и c, в то время как b содержит ссылки на d и e. Вызов writeobject(a) записи не только a, но и все объекты, необходимые, чтобы воссоздать a, таким образом, другие четыре объекта в этой сети пишутся также. Когда читается назад readObject, другие четыре объекта читаются назад также, и все исходные ссылки на объект сохраняются.

Ввод-вывод многократных упомянул объекты

Ввод-вывод многократных упомянул объекты

Вы могли бы задаться вопросом, что происходит, если два объекта на том же самом потоке оба содержат ссылки на единственный объект. Они оба обратятся к единственному объекту, когда они будут считаны назад? Ответ - "да". Поток может только содержать одну копию объекта, хотя это может содержать любое число ссылок на это. Таким образом, если Вы явно пишете объект в поток дважды, Вы действительно пишете только ссылку дважды. Например, если следующий код пишет объект ob дважды к потоку:

Object ob = new Object();
out.writeObject(ob);
out.writeObject(ob);

Каждый writeObject должен быть соответствующим a readObject, таким образом, код, который читает поток назад, будет выглядеть примерно так:

Object ob1 = in.readObject();
Object ob2 = in.readObject();

Это приводит к двум переменным, ob1 и ob2, это - ссылки на единственный объект.

Однако, если единственный объект пишется двум различным потокам, он эффективно дублируется — единственная программа, читая оба потока назад будет видеть два отличных объекта.


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Потоки данных
Следующая страница: Файловый ввод-вывод (Обладающий NIO.2)