Java_io体系之ObjectInputStream、ObjectOutputStream简介、走进源码及示例——11
来源:互联网 发布:linux 网络服务器 编辑:程序博客网 时间:2024/06/11 21:56
Java_io体系之ObjectInputStream、ObjectOutputStream简介、走进源码及示例——11
这对流也是有输入才有输出、觉得先理清输出更容易理清这对流。因为这两个类源码中牵扯到的东西较多、所以这里只列出常用方法、实例、而没有关键字和源码、有兴趣的可以自己再深入研究一下。
一:ObjectOutputStream
1、类功能简介:
对象字节输出流、将一个序列化的对象写入到构造ObjectOutputStream时传入的底层字节输出流中、通过源码可以看出、他虽然不是实现了FilterOutputStream装饰类、同时实现了ObjectOut、而此接口实现了DataOut接口、并且对这个接口进行了扩展、使得ObjectOut在具有DataOut中定义的各种方法同时、也具有将对象、数组、字符串写入到底层字节流中的功能、这样也就意味着ObjectOutputStream同样具有DataOutputStream功能的同时也具有将对象、数组字符串写入到底层字节输出流中的功能、当然ObjectOuputStream同样还实现了别的接口、因为他写入一个对象的时候、不仅仅写入的是标示这个Object的所有属性、同时还有额外的一些信息、比如版本号、作者等、但是这些对我们是透明的、具体的写入方法由JDK说了算、从这里也可以看出ObjectOutputStream与DataOutputStream之间的差异、1、ObjectOutputStream是将一个对象的所有相关属性、信息(不包括方法)写入到底层流中、而DataOutputStream一次写入的只是一个java基础类型的数据、2、读取的时候ObjectOutputStream一次读取一个对象、不必关心对象每个属性的写入顺序、而DataOutputStream读取时要严格按照写入时的顺序读取(当然、在使用skip方法时还要考虑字节数)、有关序列化的有另一篇文章说明、总结时候也会给出一点有关序列化的认识。
2、ObjectOutputStreamAPI简介:
A:构造方法
protected ObjectInputStream();用于完全重新实现ObjectInputStream的子类的构造方法、使得子类可以拥有自己的私有关键字节、而不是使用ObjectInputStream自带的字节。 ObjectInputStream(InputStream in);创建从指定 InputStream 读取的 ObjectInputStream。
B:一般方法
protected void annotateClass(Class<?> cl);子类可以实现此方法,从而允许在流中存储类数据。protected void annotateProxyClass(Class<?> cl);子类可以实现此方法,从而在流中存储定制数据和动态代理类的描述符。 void close();关闭当前流、释放所有与此流有关的资源。 void defaultWriteObject(); 将表示当前类状态的属性写入到构造时传入的底层流out中。 protected void drain();将ObjectOutputStream 中的所有已缓冲数据写入到底层流中、注意:但是不flush底层流、 protected boolean enableReplaceObject(boolean enable);允许流对流中的对象进行替换。 void flush(); 刷新该流的缓冲、这里也会将底层流中的数据flush到底层流指定的目的地中。 ObjectOutputStream.PutField putFields();获取用于缓冲写入流中的持久存储字段的对象。 protected Object replaceObject(Object obj); 在序列化期间,此方法允许 ObjectOutputStream 的受信任子类使用一个对象替代另一个对象。 void reset();重置将丢弃已写入流中的所有对象的状态。 void write(byte[] buf);写入一个 byte 数组。 void write(byte[] buf, int off, int len);写入字节的子数组。 void write(int val);写入一个字节。 void writeBoolean(boolean val);写入一个 boolean 值。 void writeByte(int val);写入一个 8 位字节。 void writeBytes(String str);以字节序列形式写入一个 String。 void writeChar(int val);写入一个 16 位的 char 值。 void writeChars(String str);以 char 序列形式写入一个 String。 protected void writeClassDescriptor(ObjectStreamClass desc);将指定的类描述符写入 ObjectOutputStream。 void writeDouble(double val);写入一个 64 位的 double 值。 void writeFields();将已缓冲的字段写入流中。 void writeFloat(float val);写入一个 32 位的 float 值。 void writeInt(int val);写入一个 32 位的 int 值。 void writeLong(long val);写入一个 64 位的 long 值。 void writeObject(Object obj);将指定的对象写入 ObjectOutputStream。 protected void writeObjectOverride(Object obj);子类用于重写默认 writeObject 方法的方法。 void writeShort(int val);写入一个 16 位的 short 值。 protected void writeStreamHeader();提供 writeStreamHeader 方法,这样子类可以将其自身的头部添加或预加到流中。 void writeUnshared(Object obj); 将“未共享”对象写入 ObjectOutputStream。 void writeUTF(String str);以 UTF-8 修改版格式写入此 String 的基本数据。
4、实例演示:
二:ObjectInputStream
1、类功能简介:
对象字节输入流、将一个序列化的对象通过底层字节输入流读取到程序中、与ObjectOutputStream相对应、实现了ObjectOut接口、而ObjectOut接口实现了DataOut接口、在DataOut接口定义的基础上扩展了读取对象、数组、字符串的功能、作为ObjectOut的实现类ObjectInputStream、它可以将使用ObjectOutputStream写入到底层输出流中的对象、数组、字符串读取到程序中、并还原成当初写入时的状态、这样我们就可以直接对这个对象进行操作。从而达到操作java对象、数组、字符串的目的。
2、ObjectInputStream API简介:
A:构造方法
protected ObjectInputStream();用于完全重新实现ObjectInputStream的子类的构造方法、使得子类可以拥有自己的私有关键字节、而不是使用ObjectInputStream自带的字节。 ObjectInputStream(InputStream in);创建从指定 InputStream 读取的 ObjectInputStream。
B:一般方法
int available();返回可以不受阻塞地读取的字节数。 void close();关闭输入流。 void defaultReadObject();从此流读取当前类状态的属性(没有被 static、transient修饰的字段)。 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。 int skipBytes(int len);跳过字节。
4、实例演示:
package com.chy.io.original.utils;import java.io.Serializable;public class StudentDTO implements Serializable{private static final long serialVersionUID = -4969451826117657169L;private int sno = 1;private String name = "chy";private int statu = 5;public StudentDTO(int sno, String name,int statu) {super();this.sno = sno;this.name = name;this.statu = statu;}public int getSno() {return sno;}public void setSno(int sno) {this.sno = sno;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getStatu() {return statu;}public void setStatu(int statu) {this.statu = statu;}}
测试类:
package com.chy.io.original.test;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import com.chy.io.original.utils.StudentDTO;public class ObjectStreamTest {private static File file = new File("D:\\oos.txt");public static void testObjectOutputStream() throws IOException{ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));StudentDTO swrite = new StudentDTO(1, "chy", 5);oos.writeObject(swrite);}public static void testObjectInputStream() throws IOException, ClassNotFoundException{ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));StudentDTO s = new StudentDTO(2, "chy1", 10);StudentDTO sread = (StudentDTO)ois.readObject();/** * 当statu的类型是int时的result: sno: 1 name: chy statu: 5 * 当statu的修饰符是static时的result: sno: 1 name: chy statu: 10 * 当statu的修饰符是transient时的result: sno: 1 name: chy statu: 0 */System.out.println(sread.toString());}public static void main(String[] args) throws IOException, ClassNotFoundException {testObjectOutputStream();testObjectInputStream();}}
这里不再将statu的类型为static、transient的代码贴出来、只是改变修饰符、可自己修改。 这里要注意一个地方、就是在测试ObjectInputStream的时候、多创建了一个没有使用的StudentDTO s、目的是为了防止后面将StudentDTO中的一个变量的类型改成static的时候、因为读取的对象中这个值与写入的时候一样而造成static变量可以写入底层流的假象。
总结:
ObjectOutputStream、ObjectInputStream这对流本质上就是操作序列化对象、用于在介质间进行传递序列化对象的属性、当然、当我们想要保存对象的某个属性的时候可以使用DataOutputStream、DataInputStream这对流、但是当我们要保存的属性恰好组成了一个对象、并且这个对象还有版本、作者等信息时、DataOutputStream这对流就不能满足我们了、其实如上面所说、ObjectInputStream这对流也是间接实现了DataOutputStream这对流的接口、并且中间穿插了一个ObjectOut这对接口、这对接口对DataOut这对进行了扩展、满足传输对象、数组、字符串。
更多IO内容:java_io 体系之目录
- Java_io体系之ObjectInputStream、ObjectOutputStream简介、走进源码及示例——11
- Java_io体系之ByteArrayInputStream、ByteArrayOutputStream简介、走进源码及示例——04
- Java_io体系之File、FileInputStream、FileOutputStream简介、走进源码及示例——05
- Java_io体系之PipedInputStream、PipedOutputStream简介、走进源码及示例——06
- Java_io体系之FilterInputStream/FilterOutputStream简介、走进源码及示例——07
- Java_io体系之DataInputStream、DataOutputStream简介、走进源码及示例——08
- Java_io体系之PrintStream简介、走进源码及示例——09
- Java_io体系之BufferedInputStream、BufferedOutputStream简介、走进源码及示例——10
- Java_io体系之CharArrayReader、CharArrayWriter简介、走进源码及示例——13
- Java_io体系之PipedWriter、PipedReader简介、走进源码及示例——14
- Java_io体系之FilterWriter、FilterReader简介、走进源码及示例——15
- Java_io体系之BufferedWriter、BufferedReader简介、走进源码及示例——16
- Java_io体系之OutputStreamWriter、InputStreamReader简介、走进源码及示例——17
- Java_io体系之FileWriter、FileReader简介、走进源码及示例——18
- Java_io体系之PrintWriter简介、走进源码及示例——19
- Java_io体系之RandomAccessFile简介、走进源码及示例——20
- Java_io体系之InputStream、OutputStream简介、走进源码——03
- Java_io体系之Writer、Reader简介、走进源码——12
- 例说SQL SERVER 2008内置函数之字符串函数
- Shell脚本学习之sed详解
- 深入理解Qt多线程
- Arduino 使用看门狗
- Python 处理 ini 格式文件
- Java_io体系之ObjectInputStream、ObjectOutputStream简介、走进源码及示例——11
- oracle 动态拼接语句并返回查询结果集
- 如何实现在自己编写的asterisk用户平台实现添加Extensions , sip ,user!
- Oracle OS认证与口令文件认证详解
- 在Mac OS X 64bit系统上编译hadoop 2.2源码
- mini-XML 中文文档
- libxml2库函数的解析
- VMware网卡模式解析
- SQL基础知识 - 数据定义