zoukankan      html  css  js  c++  java
  • IO Streams:对象流

    简介

    正如数据流支持原始数据类型的I / O一样,对象流支持对象的I / O。标准类中的大多数但不是全部都支持对象的序列化。那些实现标记接口Serializable的那些。

    对象流类是ObjectInputStream和ObjectOutputStream。这些类实现了ObjectInput和ObjectOutput,它们是DataInput和DataOutput的子接口。这意味着数据流中涵盖的所有原始数据I / O方法也在对象流中实现。因此,对象流可以包含原始值和对象值的混合。 ObjectStreams示例说明了这一点。 ObjectStreams创建与DataStream相同的应用程序,并进行了一些更改。首先,价格现在是BigDecimalobjects,以更好地表示分数值。其次,将Calendar对象写入数据文件,指示发票日期。

    如果readObject()不返回预期的对象类型,尝试将其转换为正确的类型可能会引发ClassNotFoundException。在这个简单的例子中,这不可能发生,所以我们不试图捕捉异常。相反,我们通过向主方法的throws子句添加ClassNotFoundException,通知编译器我们知道这个问题。

    读写复杂对象

    writeObject和readObject方法使用起来很简单,但它们包含一些非常复杂的对象管理逻辑。对于像日历这样的封装原始值的类来说,这并不重要。但是许多对象包含对其他对象的引用。如果readObject要从流中重构对象,则必须能够重构所引用的原始对象的所有对象。这些附加对象可能有自己的引用,依此类推。在这种情况下,writeObject遍历对象引用的整个Web,并将该Web中的所有对象写入流。因此,对writeObject的单次调用可能会导致大量对象被写入到流中。
    这在下图中演示,其中writeObject被调用来编写一个名为a的单个对象。此对象包含对对象b和c的引用,而b包含对d和e的引用。调用writeobject(a)不仅写入一个,而且还需要重写所需的所有对象,因此这个Web中的其他四个对象也是写入的。当a被readObject读回时,其他四个对象也被读回,并且保留所有的原始对象引用。



    你可能会想,如果同一流中的两个对象都包含对单个对象的引用,会发生什么。他们读回来时会指向一个对象吗?答案是“是”。流只能包含一个对象的副本,尽管它可以包含任何数量的引用。因此,如果您将一个对象明确地写入一个流两次,那么您只是写两次引用。例如,如果以下代码将一个对象ob两次写入流中:
    Object ob = new Object();
    out.writeObject(ob);
    out.writeObject(ob);
    每个writeObject必须被一个readObject匹配,所以读取流的代码看起来像这样:
    Object ob1 = in.readObject();
    Object ob2 = in.readObject();
    这导致两个变量ob1和ob2是对单个对象的引用。 然而,如果单个对象被写入两个不同的流,则它被有效地复制 - 读取两个流的单个程序将看到两个不同的对象。

  • 相关阅读:
    ORACLE数据库——触发器的创建和使用
    Oracle——游标的创建和使用
    Oracle数据库和表的操作
    JavaScript中的this,call,apply使用及区别详解
    jQuery插件开发的五种形态小结
    前端图片上传预览
    location.pathname:返回URL的域名(域名IP)后的部分。
    使用Selectivizr让IE6~8支持CSS3
    respond.js有什么作用?
    截取url参数
  • 原文地址:https://www.cnblogs.com/hhx626/p/8320407.html
Copyright © 2011-2022 走看看