简介

正如数据流支持原始数据类型的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是对单个对象的引用。 然而,如果单个对象被写入两个不同的流,则它被有效地复制 - 读取两个流的单个程序将看到两个不同的对象。


IO Streams:对象流的更多相关文章

  1. java对象流(二)

    对象流,可以将java中的对象转为字节进行输出.将对象写入文件时.文件输出流是将字节写入到文件中. 对象流是将给定的对象转化为一组字节.writeObject()方法就是将对象转为字节. 对象流,读的 ...

  2. day03 对象流与序列化

    对象流 java.io.ObjectOutputStream和ObjectInputSteam 对象流是一对高级流,在流连接中的作用是进行对象的序列化与反序列化. 对象序列化:将一个java对象按照其 ...

  3. Java:IO流其他类(字节数组流、字符数组流、数据流、打印流、Properities、对象流、管道流、随机访问、序列流、字符串读写流)

    一.字节数组流: 类 ByteArrayInputStream:在构造函数的时候,需要接受数据源,而且数据源是一个字节数组. 包含一个内部缓冲区,该缓冲区包含从流中读取的字节.内部计数器跟踪 read ...

  4. Java IO流之对象流

    对象流 1.1对象流简介 1.2对象流分类 输入流字节流处理流:ObjectInputStream,将序列化以后的字节存储到本地文件 输出流字节流处理流:ObjectOutputStream 1.3序 ...

  5. Java IO(Properties/对象序列化/打印流/commons-io)

    Java IO(Properties/对象序列化/打印流/commons-io) Properties Properties 类表示了一个持久的属性集.Properties 可保存在流中或从流中加载. ...

  6. Java之IO流进阶篇:内存流,打印流,对象流

    Java中的IO流,即为输入输出流.所谓输入输出流,都是相对于程序而言,程序就是这个参照物.一张图看懂输入输出流: 输入流抽象基类:InputStream,Reader 输出流抽象基类:OutputS ...

  7. Java文件与io——打印流和对象流

    打印流的主要功能是用于输出,在整个IO包中打印流分为两种类型: 字节打印流:PrintStream 字符打印流:PrintWriter 打印流可以很方便的进行输出 public class Print ...

  8. Java基础IO类之对象流与序列化

    对象流的两个类: ObjectOutputStream:将Java对象的基本数据类型和图形写入OutputStream ObjectInputStream:对以前使用ObjectOutputStrea ...

  9. 对象流,它们是一对高级流,负责即将java对象与字节之间在读写的过程中进行转换。 * java.io.ObjectOutputStream * java.io.ObjectInputStream

    package seday06; import java.io.Serializable;import java.util.Arrays; /** * @author xingsir * 使用当前类来 ...

随机推荐

  1. OpenGL位图变形问题

    因为初次接触OpenGL,图形学也后悔当初在学校没有认真学,隐约记得教授当时讲过图像变形的问题,而且我的bitmap也是2的N次方:16*16的,在网络上找到的大多都是一句话:“视口的纵横比一般和视景 ...

  2. UVALive 3530 Martian Mining(贪心,dp)

    分析: 对于网格grid[i][j]如果放向上的管道,那么grid[i][k], k>j 就只能放向上的管道了. 那么定义dp[i][j]表示第i行,最后一个放向左的管道是j的最大总矿量. j ...

  3. Android(java)学习笔记102:Dalivk虚拟机的初始化过程

    1. 初始化下面系统函数(调用dvmStartup函数初始化所有相关的函数) 开始学习虚拟机的初始化过程,先从dvmStartup函数开始,这个函数实现所有开始虚拟机的准备工作:    dvmAllo ...

  4. Java jvm 内存回收机制

    http://blog.csdn.net/yaerfeng/article/details/51291903 在Java中,它的内存管理包括两方面:内存分配(创建Java对象的时候)和内存回收,这两方 ...

  5. java打包打包

    http://blog.sina.com.cn/s/blog_6b9dcc870101k8xq.html 上面说的最后一种方法,不太对. 下面这个可以 Try the fat-jar extensio ...

  6. Bootstrap 历练实例 - 按钮(Button)插件复选框

    复选框(Checkbox) 您可以创建复选框按钮 组,并通过向 btn-group 添加 data 属性 data-toggle="buttons" 来添加复选框按钮组的切换. & ...

  7. 模板引擎原理及underscore.js使用

    为什么要使用模板引擎 DOM结构简单,完全可以使用DOM方法创建DOM树.$("<td></td").appendTo(); 当页面比较复杂的时候,下面的程序中红 ...

  8. 深入理解new String()

    一. 引言 new String("hello")这样的创建方式,到底创建了几个String对象? 二. 分析 String s1 = "HelloWorld" ...

  9. Linux下C程序内存泄露检测

    在linux下些C语言程序,最大的问题就是没有一个好的编程IDE,当然想kdevelop等工具都相当的强大,但我还是习惯使用kdevelop工具,由于没有一个习惯的编程IDE,内存检测也就成了在lin ...

  10. ORTP-0.27.0移植

    注意: a. 对于0.27一下版本的ORTP的交叉编译则没有一下依赖库 b. 交叉编译工具链是: arm-linux-gnueabihf-gcc-4.9.1 (4.9版本一下的编译bctoolbox出 ...