Spec-Zone .ru
спецификации, руководства, описания, API
|
Так же, как потоки данных поддерживают ввод-вывод примитивных типов данных, объектные потоки поддерживают ввод-вывод объектов. Больше всего, но не все, стандартные классы поддерживают сериализацию своих объектов. Те, которые действительно реализуют интерфейс маркера Serializable
.
Объектные потоковые классы ObjectInputStream
ObjectOutputStream
ObjectInput
ObjectOutput
DataInput
и DataOutput
. Это означает, что все примитивные методы ввода-вывода данных, покрытые Потоками данных, также реализуются в объектных потоках. Таким образом, объектный поток может содержать смесь примитивных и объектных значений. ObjectStreams
пример иллюстрирует это. ObjectStreams
создает то же самое приложение как DataStreams
, с несколькими изменениями. Во-первых, цены теперь BigDecimal
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
, это - ссылки на единственный объект.
Однако, если единственный объект пишется двум различным потокам, он эффективно дублируется — единственная программа, читая оба потока назад будет видеть два отличных объекта.