`
810364804
  • 浏览: 785571 次
文章分类
社区版块
存档分类
最新评论

Java_io体系之ObjectInputStream、ObjectOutputStream简介、走进源码及示例——11

 
阅读更多

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放在一起、仅针对写入对象进行操作、其他的写入基本类型的方法与DataOuputStream相似。

二: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、实例演示:


StudentDTO类:

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变量可以写入底层流的假象。

shuchu

总结:

ObjectOutputStream、ObjectInputStream这对流本质上就是操作序列化对象、用于在介质间进行传递序列化对象的属性、当然、当我们想要保存对象的某个属性的时候可以使用DataOutputStream、DataInputStream这对流、但是当我们要保存的属性恰好组成了一个对象、并且这个对象还有版本、作者等信息时、DataOutputStream这对流就不能满足我们了、其实如上面所说、ObjectInputStream这对流也是间接实现了DataOutputStream这对流的接口、并且中间穿插了一个ObjectOut这对接口、这对接口对DataOut这对进行了扩展、满足传输对象、数组、字符串。


更多IO内容:java_io 体系之目录


分享到:
评论

相关推荐

    java_rpc_demo

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

    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....

    ObjectInputStream 和 ObjectOutputStream 介绍_动力节点Java学院整理

    ObjectInputStream 和 ObjectOutputStream 的作用是,对基本数据和对象进行序列化操作支持。本文给大家详细介绍了ObjectInputStream 和 ObjectOutputStream的相关知识,感兴趣的朋友一起学习吧

    java上的即时通信

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

    学生管理系统

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

    java.io常用方法(基本)

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

    JAVA_ObjectInputStream

    拿点积分啊,不然不给下东西. Java Object的一个学习源码.

    android 面试题

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

    IO体系.java

    |--ObjectOutputStream/:将java对象的基本数据类型和图形写入到OutputStream。 | |--PipedOutputStream/:可以将管道输出流连接到管道输入流来创建通信管道。 | 用方法connect(PipedInputStream snk) 将此管道...

    ObjectInputStream

    ObjectInputStream序列化实例,简单就学会,JAVA原来so easy

    JavaIOObjectStreams:FileInputStream 与 ObjectInputStream 和 ObjectOutputStream 的组合

    JavaIO对象流 FileInputStream 与 ObjectInputStream 和 ObjectOutputStream 的组合 奥利弗·缪尔

    JDK_API_1_6

    Serializable 类通过实现 java.io.Serializable 接口以启用其序列化功能。 类摘要 BufferedInputStream BufferedInputStream 为另一个输入流添加一些功能,即缓冲输入以及支持 mark 和 reset 方法的能力。 ...

    java序列化与ObjectOutputStream和ObjectInputStream的实例详解

    主要介绍了java序列化与ObjectOutputStream和ObjectInputStream的实例详解的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下

    Java之IO流学习总结

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

    ObjectInputStream的用法---马克-to-win java视频

    ObjectInputStream的用法---马克-to-win java视频的介绍对象输入字节流

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

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

    socket编程

    at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2552) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1297) at java.io.ObjectInputStream.readObject...

    JAVA基础课程讲义

    ObjectInputStream和ObjectOutputStream 158 PrintStream 158 Reader 158 Writer 159 FileReader和FileWriter 159 BufferReader和BufferWriter 159 InputStreamReader和OutputStreamWriter 161 JAVA对象的序列化和反...

    java72-java-advance.rar

    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. ByteArrayOutputStream将下列哪一项作为输出流 C a)...

    java io 类 小结 代码

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

Global site tag (gtag.js) - Google Analytics