`
rl784rl
  • 浏览: 12586 次
最近访客 更多访客>>
社区版块
存档分类

java.io 类 ObjectInputStream

 
阅读更多

java.io 类 ObjectInputStream
2010年11月23日
  java.io 类 ObjectInputStream
  java.lang.Object
  java.io.InputStream
  java.io.ObjectInputStream
  所有已实现的接口:
  Closeable, DataInput, ObjectInput, ObjectStreamConstants
  --------------------------------------------------------------------------------
  public class ObjectInputStreamextends InputStreamimplements ObjectInput, ObjectStreamConstantsObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。
  ObjectOutputStream 和 ObjectInputStream 分别与 FileOutputStream 和 FileInputStream 一起使用时,可以为应用程序提供对对象图形的持久存储。ObjectInputStream 用于恢复那些以前序列化的对象。其他用途包括使用套接字流在主机之间传递对象,或者用于编组和解组远程通信系统中的实参和形参。
  ObjectInputStream 确保从流创建的图形中所有对象的类型与 Java 虚拟机中显示的类相匹配。使用标准机制按需加载类。
  只有支持 java.io.Serializable 或 java.io.Externalizable 接口的对象才能从流读取。
  readObject 方法用于从流读取对象。应该使用 Java 的安全强制转换来获取所需的类型。在 Java 中,字符串和数组都是对象,所以在序列化期间将其视为对象。读取时,需要将其强制转换为期望的类型。
  可以使用 DataInput 上的适当方法从流读取基本数据类型。
  默认情况下,对象的反序列化机制会将每个字段的内容恢复为写入时它所具有的值和类型。反序列化进程将忽略声明为瞬态或静态的字段。对其他对象的引用使得根据需要从流中读取这些对象。使用引用共享机制能够正确地恢复对象的图形。反序列化时始终分配新对象,这样可以避免现有对象被重写。
  读取对象类似于运行新对象的构造方法。为对象分配内存并将其初始化为零 (NULL)。为不可序列化类调用无参数构造方法,然后从以最接近 java.lang.object 的可序列化类开始和以对象的最特定类结束的流恢复可序列化类的字段。
  例如,要从由 ObjectOutputStream 中的示例写入的流读取:
  FileInputStream fis = new FileInputStream("t.tmp");
  ObjectInputStream ois = new ObjectInputStream(fis);
  int i = ois.readInt();
  String today = (String) ois.readObject();
  Date date = (Date) ois.readObject();
  ois.close();
  类控制实现 java.io.Serializable 或 java.io.Externalizable 接口时的序列化方式。
  实现 Serializable 接口允许对象序列化,以保存和恢复对象的全部状态,并且允许类在写入流时的状态和从流读取时的状态之间变化。它自动遍历对象之间的引用,保存和恢复全部图形。
  在序列化和反序列化进程中需要特殊处理的 Serializable 类应该实现以下方法:
  private void writeObject(java.io.ObjectOutputStream stream)
  throws IOException;
  private void readObject(java.io.ObjectInputStream stream)
  throws IOException, ClassNotFoundException;
  private void readObjectNoData()
  throws ObjectStreamException;
  readObject 方法负责使用通过对应的 writeObject 方法写入流的数据,为特定类读取和恢复对象的状态。该方法本身的状态,不管是属于其超类还是属于其子类,都没有关系。恢复状态的方法是,从个别字段的 ObjectInputStream 读取数据并将其分配给对象的适当字段。DataInput 支持读取基本数据类型。
  尝试读取由对应的 writeObject 方法写入的超出自定义数据边界的对象数据将导致抛出 OptionalDataException(eof 字段值为 true)。超出已分配数据末尾的非对象读取以指示流末尾的方式反映数据结束:按位读取与字节读取或字节数读取一样,将返回 -1,基元读取将抛出 EOFException。如果不存在对应的 writeObject 方法,则默认的序列化数据的末尾标记已分配数据的末尾。
  从 readExternal 方法发出的基元和对象读取调用的行为方式一样:如果流已经定位在由相应 writeExternal 方法写入的数据末尾,则对象读取将抛出 OptionalDataException(其 eof 设置为 true),按位读取将返回 -1,基元读取将抛出 EOFException。注意,此行为不适用于使用旧 ObjectStreamConstants.PROTOCOL_VERSION_1 协议写入的流,在这些流中,没有划分出由 writeExternal 方法写入的数据末尾,因此无法检测。
  如果序列化流没有将给定类列为要反序列化的对象的超类,则 readObjectNoData 方法负责初始化其特定类的对象状态。在接收方使用的反序列化实例类的版本不同于发送方,并且接收者版本扩展的类不是发送者版本扩展的类时,此事可能发生。如果序列化流已经被篡改,也会发生这种情况;因此,不管源流是“敌意的”还是不完整的,readObjectNoData 方法都可以用来正确地初始化反序列化的对象。
  对于没有实现 java.io.Serializable 接口的任何对象,序列化不会对其字段进行读取或赋值。非 serializable 的 Object 的子类可以为 serializable。在此情况下,非 serializable 类必须具有无参数的构造方法以允许其字段能被初始化。在此情况下,子类负责保存和恢复非 serializable 类的状态。经常出现的情况是,该类的字段是可访问的(public、package 或 protected),或者存在可用于恢复状态的 get 和 set 方法。
  反序列化对象进程中发生的所有异常将由 ObjectInputStream 捕获并将中止读取进程。
  实现 Externalizable 接口允许对象假定可以完全控制对象的序列化形式的内容和格式。调用 Externalizable 接口的方法(writeExternal 和 readExternal)来保存和恢复对象状态。当这两种方法被某个类实现时,它们可以使用 ObjectOutput 和 ObjectInput 的所有方法读写其本身的状态。对象负责处理出现的任何版本控制。
  Enum 常量的反序列化不同于普通的 serializable 或 externalizable 对象。Enum 常量的序列化形式只包含其名称;不传送常量的字段值。要反序列化 enum 常量,ObjectInputStream 需要从流中读取常量的名称;然后将 enum 常量的基本类型和接收到的常量名称作为参数,调用静态方法 Enum.valueOf(Class, String) 获取反序列化的常量。与其他 serializable 或 externalizable 对象一样,enum 常量可以作为序列化流中随后出现的反向引用的目标。不可以自定义 enum 常量的反序列化进程:在反序列化期间,enum 类型所定义的任何与类有关的 readObject、readObjectNoData 和 readResolve 方法都将被忽略。类似地,任何 serialPersistentFields 或 serialVersionUID 字段声明也将被忽略(所有 enum 类型都有一个固定的 0L 的 serialVersionUID)。
  从以下版本开始:
  JDK1.1
  另请参见:
  DataInput, ObjectOutputStream, Serializable, 对象序列化规范:Object Input Classes 第三节
  --------------------------------------------------------------------------------
  嵌套类摘要
  static class ObjectInputStream.GetField
  提供对从输入流读取的持久字段的访问权限。
  字段摘要
  从接口 java.io.ObjectStreamConstants 继承的字段
  baseWireHandle, PROTOCOL_VERSION_1, PROTOCOL_VERSION_2, SC_BLOCK_DATA, SC_ENUM, SC_EXTERNALIZABLE, SC_SERIALIZABLE, SC_WRITE_METHOD, STREAM_MAGIC, STREAM_VERSION, SUBCLASS_IMPLEMENTATION_PERMISSION, SUBSTITUTION_PERMISSION, TC_ARRAY, TC_BASE, TC_BLOCKDATA, TC_BLOCKDATALONG, TC_CLASS, TC_CLASSDESC, TC_ENDBLOCKDATA, TC_ENUM, TC_EXCEPTION, TC_LONGSTRING, TC_MAX, TC_NULL, TC_OBJECT, TC_PROXYCLASSDESC, TC_REFERENCE, TC_RESET, TC_STRING
  构造方法摘要
  protected  ObjectInputStream()
  为完全重新实现 ObjectInputStream 的子类提供一种方式,让它不必分配仅由 ObjectInputStream 的实现使用的私有数据。
  ObjectInputStream(InputStream in)
  创建从指定 InputStream 读取的 ObjectInputStream。
  方法摘要
  int available()
  返回可以不受阻塞地读取的字节数。
  void close()
  关闭输入流。
  void defaultReadObject()
  从此流读取当前类的非静态和非瞬态字段。
  protected  boolean enableResolveObject(boolean enable)
  使流允许从该流读取的对象被替代。
  int read()
  读取数据字节。
  int read(byte[] buf, int off, int len)
  读入 byte 数组。
  boolean readBoolean()
  读取一个 boolean 值。
  byte readByte()
  读取一个 8 位的字节。
  char readChar()
  读取一个 16 位的 char 值。
  protected  ObjectStreamClass readClassDescriptor()
  从序列化流读取类描述符。
  double readDouble()
  读取一个 64 位的 double 值。
  ObjectInputStream.GetField readFields()
  按名称从流中读取持久字段并使其可用。
  float readFloat()
  读取一个 32 位的 float 值。
  void readFully(byte[] buf)
  读取字节,同时阻塞直至读取所有字节。
  void readFully(byte[] buf, int off, int len)
  读取字节,同时阻塞直至读取所有字节。
  int readInt()
  读取一个 32 位的 int 值。
  String readLine()
  已过时。 此方法不能正确地将字节转换为字符。请参见 DataInputStream 以获取详细信息和替代方法。
  long readLong()
  读取一个 64 位的 long 值。
  Object readObject()
  从 ObjectInputStream 读取对象。
  protected  Object readObjectOverride()
  此方法由 ObjectOutputStream 的受信任子类调用,这些子类使用受保护的无参数构造方法构造 ObjectOutputStream。
  short readShort()
  读取一个 16 位的 short 值。
  protected  void readStreamHeader()
  提供的 readStreamHeader 方法允许子类读取并验证它们自己的流头部。
  Object readUnshared()
  从 ObjectInputStream 读取“非共享”对象。
  int readUnsignedByte()
  读取一个无符号的 8 位字节。
  int readUnsignedShort()
  读取一个无符号的 16 位 short 值。
  String readUTF()
  读取 UTF-8 修改版格式的 String。
  void registerValidation(ObjectInputValidation obj, int prio)
  在返回图形前注册要验证的对象。
  protected  Class resolveClass(ObjectStreamClass desc)
  加载指定流类描述的本地等价类。
  protected  Object resolveObject(Object obj)
  在反序列化期间,此方法允许 ObjectInputStream 的受信任子类使用一个对象替代另一个。
  protected  Class resolveProxyClass(String[] interfaces)
  返回一个代理类,该类实现在代理类描述符中命名的接口;子类可以实现此方法,以便从流及动态代理类的描述符中读取自定义数据,允许它们使用接口和代理类的替换加载机制。
  int skipBytes(int len)
  跳过字节。
  从类 java.io.InputStream 继承的方法
  mark, markSupported, read, reset, skip
  从类 java.lang.Object 继承的方法
  clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  从接口 java.io.ObjectInput 继承的方法
  read, skip
分享到:
评论

相关推荐

    java项目超市

    import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; import java....

    java上的即时通信

    import java.io.ObjectInputStream; import java.io.IOException; import java.io.EOFException; import java.net.ServerSocket; import java.net.Socket; import java.awt.BorderLayout; import java.awt.Container...

    学生管理系统

    import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.ArrayList; public class StuC { ArrayList <Student> al=new ArrayList();//类型ArrayList是集合,在定义ArrayList类型...

    java72-java-advance.rar

    1.java语言提供处理不同类型流的类的包是(D) a)java.sql b) java.util c) java.math d) java.io 2.不属于java.io包中的接口的一项是(C) a)DataInput b) DataOutput c) DataInputStream d) ObjectInput 3. ...

    java.io常用方法(基本)

    我自己写的一些关于IO中的见解,可以用来参考。 File的增、删、改、查,FileReader和FileWriter类,BufferedReader和BufferedWriter类,ObjectOutputStream和ObjectInputStream类

    java_rpc_demo

    (1)用java写的RPC调用的demo。...(2)没有用到其他的jar包,java对象和流之间的转换用的是java.io.ObjectInputStream和java.io.ObjectOutputStream。 (3)下载解压,可以直接导入Eclipse运行调试。

    socket编程

    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1297) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) at theqq.server$MyThread.run(server.java:157)

    在Java中优雅而简洁的创建对象的方法总结

    一般在Java里创建一个对象,有常用的几种方式 正常通过 new 操作符;...反序列化调用 java.io.ObjectInputStream 的 getObject()方法反序列化 各自适合的场景,面对参数的变化,本资源提供了最优解决方案

    Java跳过构造方法新建对象

     (4) 运用反序列化手段,调用java.io.ObjectInputStream对象的 readObject()方法。  1.new方法显式调用构造方法;  2.反射方法无论是反射类还是反射构造方法都是通过构造方法构建对象;  3.通过对一个原有对象...

    基于JAVA的聊天系统的设计与实现

    import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.Socket; import java.util.*; import qq.dao.hibernate.IServiceDao; import qq.entity.*; public class ...

    android 面试题

    4.java.io包中的objectinputstream和objectoutputstream类主要用于对对象(Object)的读写。 5.android 中service的实现方法是:startservice和bindservice。 6.activity一般会重载7个方法用来维护其生命周期,除了...

    JAVA基础知识点,J2SE部分内容

    我们使用JAVA的IO操作,必须要使用java.io里的类,所以在使用之前先要导入这个包 3.了解java.io包下的整体结构层次 按层次高低划分 由低---高 3-1.字节流 •抽象父类是 InputStream 和OutputStream 3-2.字符流...

    RSA+bcpkix-jdk15.zip

    import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.math.BigInteger; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; ...

    Java高级程序设计实战教程第五章-Java序列化机制.pptx

    其中包括以下接口和类: java.io.Serializable java.io.Externalizable ObjectOutput ObjectInput ObjectOutputStream ObjectInputStream Java高级程序设计实战教程第五章-Java序列化机制全文共15页,当前为第7页。...

    DVD项目功能实现

    import java.io.*; import java.util.ArrayList; import java.util.List; public class BaseDaoImpl<T> { protected List<T> read(File file) { FileInputStream fis = null; ObjectInputStream ois = null; ...

    JAVA核心知识点整理(有效)

    25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................

    Java之IO流学习总结

    Java IO流学习总结 Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据...

    JAVA实现SOCKET聊天

    用JAVA语言实现网络聊天import java.io.*; import java.net.*; import java.util.*; public class ChatHandler implements Runnable { protected Socket socket; protected ObjectInputStream dataIn; ...

    JAVA高级程序设计测试题含答案.docx

    示例 第2题 【单选题】【2.00分】【概念理解】 java.io包的File类是 [单选题] * A. 字符流类 B. 字节流类 C. 对象流类 D. 非流类(正确答案) E. 示例 JAVA高级程序设计测试题含答案全文共43页,当前为第1页。第3题 ...

    java io 类 小结 代码

    简洁分类 代码直接使用 InputStream OutputStream Reader Writer FileInputStream FileOutputStream FileReader FileWriter InputStreamReader OutputStreamWriter ...ObjectInputStream Scanner

Global site tag (gtag.js) - Google Analytics